Group concat with where match against in mysql

Group concat with where match against in mysql

我正在使用 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 有效。但是,我不能将 MATCH AGAINST 与虚拟值 keywords 值一起使用。

我读到了我认为是一个丑陋的解决方法,补充一下:

HAVING keywords LIKE "%keyword1%"

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

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

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

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

    OR EXISTS ( SELECT 1
                  FROM categories k 
                 WHERE k.id = pc.category_id
                   AND k.title IN ('Test1','Test2')
              )    

GROUP BY 之前将消除从 GROUP_CONCAT 扫描 return 的需要,如果规范是 return 行,其中类别标题与指定的搜索词。


如果实际上不需要 return 结果集中派生的 keywords 列,我会避免使用 GROUP BY。

SELECT p.id AS id
     , p.title AS title
     , p.title AS company
  FROM products p
  JOIN companies co
    ON co.id = p.company_id
 WHERE MATCH (p.title) AGAINST ('Test')
    OR MATCH (co.title) AGAINST ('Test')
    OR EXISTS ( SELECT 1
                  FROM categories k
                  JOIN product_categories pc
                    ON pc.category_id = k.id
                 WHERE pc.product_id = p.id
                   AND k.title IN ('Test1','Test2')
              )
 ORDER BY p.id