我正在使用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。那么,我的选择是什么?
我可能需要一个示例代码才能理解。
答案 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