嗨,我遇到了我的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;


(查询未经测试,但是您应该了解一下。)

10-08 02:26