您好我的SQL查询出了问题,我有一个包含3列的表格,一个用于车辆品牌,一个用于型号,另一个用于< strong>模型版本。
所以我的数据分为
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”...当用户插入类似雷诺R4 的东西而不仅仅是“雷诺”
由于他们已包含模型名称以及品牌,因此它与数据库中的任何列都不匹配,并且我的Ajax调用返回no结果。 我需要从该concat中查询实际结果集,以便用户输入的任何内容都与结果匹配,但我不知道我该怎么做。
在绝望中我试图键入where data LIKE '%RENAULT R4%'
,但正如预期的那样,这也行不通......在这种情况下我该怎么办?任何帮助,将不胜感激。
答案 0 :(得分: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;
(查询未经过测试,但您应该明白这一点。)
答案 1 :(得分:0)
我只能想到这一个,但我相信有更好的方法可以做到这一点。
OR CONCAT (brand, ' ', model, ' ', version) LIKE '%RENAULT R4%'