0

我有两个表 - 'brands' & 'phones' 如下面的 sqlfiddle 所示

http://sqlfiddle.com/#!2/6da79

brands(id, brand) 
phones(id, brand_id, phone)

我基本上想知道如何最好地实现将执行以下操作的搜索-如果用户输入“索尼爱立信”-它会显示该品牌的所有手机..但是如果他们输入搜索词“索尼爱立信 Xperia”,它将足够聪明地点赞并取回名为“Xperia P”的手机。

我可以理解逻辑 - 只是试图找到以最小的数据库占用空间来完成此操作的最佳优化方法。

我的伪代码如下所示:

  1. 从搜索关键字词(例如索尼)对品牌表进行 LIKE 查询
  2. 如果找到匹配项,则显示该品牌的所有手机(例如 Xperia P、W500)
  3. 如果用户输入“Sony Ericsson Xperia” - 我们将要从查询中删除“Sony Ericsson”,只需对“Xperia”执行类似查询并返回“Xperia P”

任何人都可以推荐最优化的方法吗?

4

4 回答 4

2

也许您应该像使用全文搜索一样

    select * from brands b join phones p
    on p.brand_id = b.id
    where match (b.brand, p.phone)
    against ('sony ericsson xperia' IN BOOLEAN MODE)

但它只适用于 myIsam 引擎(:

查看

于 2013-09-27T15:17:06.207 回答
1

最简单的方法是连接这两个表并连接品牌名称和电话名称。然后匹配这个连接的字符串:

select *
from brands
join phones on (phones.brand_id = brands.id)
where concat(brands.brand, ' ', phones.phone) like concat('your search string here','%')

这符合您的要求。尽管如此,请注意这仍然是一个非常糟糕的搜索引擎。搜索字符串必须完全匹配。“Sony”有,“Sony Ericsson”有,“Sony Ericsson Xperia”有,甚至“Sony E”有,但“Sony Ericsson”(两个空格)没有,“Sony Xperia”也没有。

于 2013-09-30T05:29:27.877 回答
0

您可能想要加入。尝试类似:

SELECT phones.id, phones.phone, brands.id, brands.brand 
FROM brands, phones  
WHERE brands.brand LIKE 'Sony Ericsson' AND brands.id = phones.brand_id;

您也可以随时使用 OR 调整上述内容以搜索电话名称。

于 2013-09-27T15:18:44.630 回答
0

http://sqlfiddle.com/#!2/fcb807

基本上按照建议使用了以下方法 - 请参阅 sqlfiddle 并使用另一个表来执行与电话表的 id 链接的查询。我希望这是有道理的:-) 再次感谢

于 2013-09-27T16:04:27.317 回答