我有三个表:cars
,colours
和cars_has_colours
,其中前两个表具有多对多关系。
我想搜索cars
,理想情况下使用MATCH和AGAINST。如果我想搜索cars.name
,这很容易实现。
如果可能的话,我想用MATCH和AGAINST搜索colours
。这样做的原因是MATCH对颜色的结果可以添加到名称等MATCH的结果中。
因此,例如,如果我搜索"蓝色"我希望看到任何车型都是" Sky Blue"或者"海军蓝"。
理想情况下,我想使用文本搜索并能够获得某种相关性分数,而不是使用WHERE / IN,以便在搜索" blue"," Sky Blue&时#34;和"海军蓝"彩色汽车归还,但是一辆名为" bluebird" (尽管它可能不一定与"蓝色"在colours
中)有关系
我在子查询上尝试了GROUP_CONCAT,这给了我一个包含所有颜色的字符串,但我不能在MATCH中使用它作为参数(奇怪的是,我得到的错误告诉我,我在AGAINST中有一个无效的参数,即使我只按照文档放入一个字符串文字)
我希望这是有道理的。
答案 0 :(得分:1)
SELECT c.*, cl.colour,
(MATCH (cl.colour AGAINST ('blue') + MATCH(c.name) AGAINST ('blue')) AS score
FROM cars AS c
LEFT JOIN cars_has_colours AS cc ON cc.car_id = c.id
LEFT JOIN colours AS cl ON cc.colour_id = cl.id AND MATCH(cl.colour) AGAINST ('blue')
WHERE MATCH (c.name) AGAINST ('blue') OR cl.id IS NOT NULL
ORDER BY score DESC