在mysql中匹配where的组连接

时间:2017-11-15 15:00:17

标签: mysql match group-concat against

我正在使用SQL进行简单的搜索功能,并且卡住了。我使用GROUP_CONCAT将所有关键字放在一行中。关键字来自类别。

并非所有列都在此示例中。我把它剥了下来

SELECT
  p.id as id,
  p.title as title,
  p.title as company,
  GROUP_CONCAT(DISTINCT cat.title SEPARATOR " ") as keywords,
  FROM products p
    JOIN product_categories pc ON p.id = pc.product_id
    JOIN categories cat ON pc.category_id = cat.id
    JOIN companies co ON p.company_id = co.id
 WHERE MATCH (p.title) AGAINST ("Test")
 OR MATCH (co.title) AGAINST ("Test")
 GROUP BY p.id

keywords包含keyword1 keyword2 keyword3

之类的内容

上面的SQL正在运行。但是,我无法使用具有虚拟值keywords值的MATCH AGAINST。

我已经阅读了我认为难以解决的问题,添加以下内容:

HAVING keywords LIKE "%keyword1%"

LIKE可能很慢,因为HAVING在GROUP BY后我不能使用OR所以在这种情况下HAVING会覆盖WHERE。

理想情况下,我也希望在keywords上使用MATCH AGAINST。那么,我的选择是什么?

  • 某种虚拟桌?
  • 子查询?
  • 别的什么?

我可能需要一个示例代码才能理解。

1 个答案:

答案 0 :(得分:1)

这不回答您提出的问题,但我认为将此条件添加到查询的WHERE子句中:

https://www.example.com/zpro?type=oil
如果规范要返回类别标题与指定搜索词之一匹配的行,那么 OR EXISTS ( SELECT 1 FROM categories k WHERE k.id = pc.category_id AND k.title IN ('Test1','Test2') ) 将无需扫描GROUP BY的返回值。

如果没有要求在结果集中实际返回派生的GROUP_CONCAT列,我将避免使用GROUP BY。

keywords