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。那么,我有什么选择?
- 某种虚拟 table?
- 子查询?
- 还有别的吗?
我可能需要一个示例代码来理解。
这没有回答您提出的问题,但我认为将此条件添加到查询的 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
我正在使用 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。那么,我有什么选择?
- 某种虚拟 table?
- 子查询?
- 还有别的吗?
我可能需要一个示例代码来理解。
这没有回答您提出的问题,但我认为将此条件添加到查询的 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