检查多列匹配MySQL匹配

时间:2017-01-09 11:02:17

标签: mysql database concat

您好我的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%',但正如预期的那样,这也行不通......在这种情况下我该怎么办?任何帮助,将不胜感激。

2 个答案:

答案 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%'