嗨,我遇到了我的SQL查询问题,我有一个表,其中包含3列,一列用于车辆品牌,一列用于模型,一列用于模型版本。
所以我的数据像
BRAND || MODEL || MODEL VERSION
RENAULT || R4 || R4 1.1 GTL
我被要求用输入来替换当前的下拉菜单系统,以使用户更容易选择他们的车辆。
我正在使用jQuery Autocomplete,而我的查询看起来像这样。
SELECT DISTINCT CONCAT (brand, ' ', model, ' ', version) as data from vehicles WHERE brand LIKE '%Golf%' OR model LIKE '%Golf%' OR version LIKE '%Golf%' LIMIT 5
到目前为止,如果我键入“ RENAULT”,它将输出“ RENAULT R4 R4 1.1 GTL” ...当用户插入类似Renault R4之类的东西而不仅仅是“ Renault”时,就会出现问题
因为他们已经包括了模型名称和品牌,所以它实际上与数据库中的任何列都不匹配,并且我的Ajax调用未返回任何结果。
我需要查询该concat的实际结果集,以便用户键入的任何内容都将与结果匹配,但是我不知道该怎么做。
无奈之下,我尝试键入
where data LIKE '%RENAULT R4%'
,但是按预期,这也行不通...在这种情况下我该怎么办?任何帮助,将不胜感激。 最佳答案
简单,缓慢的方法:用空格将字符串分开,并要求每个单词。
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;
(查询未经测试,但是您应该了解一下。)