2017-01-09 12 views
0

嗨,我已经打了一个问题,我的SQL查询,我有一个包含3列,一个用于车辆品牌,一个用于模式,一个用于模型版本的表检查多个列的级联匹配的MySQL

所以我的数据被分割像

BRAND || MODEL || MODEL VERSION 
RENAULT || R4 || R4 1.1 GTL 

我一直在问的输入与取代我们目前下拉菜单系统,使用户更容易选择他们的车辆。

我正在使用jQuery自动完成,我的查询看起来像这样。

SELECT DISTINCT CONCAT (brand, ' ', model, ' ', version) as data from vehicles WHERE brand LIKE '%Golf%' OR model LIKE '%Golf%' OR version LIKE '%Golf%' LIMIT 5 

到目前为止好,这将输出“雷诺R4 R4 1.1 GTL”如果我键入“雷诺” ......这里的问题当用户插入类似雷诺R4,而不仅仅是来“雷诺”

因为他们已经包含在型号名称以及该品牌那么它并没有真正匹配任何我的数据库列和我的Ajax调用返回没有结果的。 我需要从该concat中查询实际结果集,以便用户输入的内容与结果匹配,但我不知道如何执行此操作。

无奈之下,我试图输入where data LIKE '%RENAULT R4%',但正如预期的那样,这也行不通......我在这种情况下能做什么?任何帮助,将不胜感激。

回答

0

简单和慢速的方法:将字符串拆分为空格并询问每个单词。

SELECT ... 
WHERE 
    (brand LIKE '%Renault%' OR model LIKE '%Renault%' OR version LIKE '%Renault%') 
    AND (brand LIKE '%R4%' OR model LIKE '%R4%' OR version LIKE '%R4%') 
LIMIT 5 

请记住,像这样的查询不允许使用任何索引,所以它非常缓慢。

更复杂但更快的执行方式是使用fulltext index。你需要MySQL的最新版本(5.6或更新版本);旧版本仅在MyISAM表上支持全文,而这些表不是真正的数据库。

CREATE FULLTEXT INDEX idx ON vehicles(brand, model, version); 
SELECT ... FROM vehicles 
WHERE MATCH(brand, model, version) AGAINST('Renault R4') 
LIMIT 5; 

(查询没有测试过,但你应该明白我的意思。)

+0

@Josef_Kufner全文索引正在恢复一切,如果我对阵雷诺R4返回雷诺的所有实例,而不仅仅是匹配字符串的那些... :( – JonnySerra

+0

匹配,对运营商的回报得分这个行与查询有多相关,你可以按照分数对行进行排序,并首先提供最好的匹配,并且还有更多的选择如何使用全文 - 查看文档并稍微玩一下。 –

0

我只能想到这一个,但我相信有更好的方法来做到这一点。

OR CONCAT (brand, ' ', model, ' ', version) LIKE '%RENAULT R4%'