选择具有模糊匹配的两个表的查询

时间:2013-09-27 15:03:41

标签: php mysql sql

我有两张桌子 - '品牌'和'手机',如下面的方形图所示

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

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

我基本上想知道如何最好地实现将执行以下操作的搜索 - 如果用户输入'Sony Ericcson' - 它会显示该品牌的所有手机..但是如果他们输入搜索词'Sony Ericsson Xperia “聪明地做一个LIKE并找回一部名为'Xperia P'的手机。

我可以理解逻辑 - 只是试图找到最佳的方法,以最小的数据库占用空间。

我的伪代码如下所示:

  1. 从搜索关键字词组(例如Sony)
  2. 对品牌表进行LIKE查询
  3. 如果找到匹配项,则显示该品牌的所有手机(例如Xperia P,W500)
  4. 如果用户输入“索尼爱立信Xperia” - 我们将要从查询中删除“索尼爱立信”并在“Xperia”上执行类似查询并返回“Xperia P”
  5. 有人可以推荐最优化的方法吗?

4 个答案:

答案 0 :(得分: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引擎(:

check

答案 1 :(得分:1)

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

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

这符合您的要求。尽管如此,请注意这仍是一个非常糟糕的搜索引擎。搜索字符串必须完全匹配。 '索尼'确实,'索尼爱立信','索尼爱立信Xperia',甚至'索尼E',但'索尼爱立信'(两个空白)没有,'索尼Xperia'也没有。

答案 2 :(得分: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调整上述内容以搜索电话名称。

答案 3 :(得分:0)

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

基本上按照建议使用以下方法 - 查看sqlfiddle并使用另一个表来执行与phone表的id链接的查询。我希望它有意义:-)再次感谢