我已成功设法通过以AND方式匹配标记来获取文章过滤。
这是我目前的代码:
SELECT *
FROM articles a
JOIN article_tags a_t ON a_t.article_id = a.id
LEFT JOIN tags t ON t.id = a_t.tag_id
WHERE t.caption IN ('fire', 'water', 'earth')
HAVING COUNT(DISTINCT t.caption) = 3
其中:
现在的问题是,在匹配之后,我想要检索每篇文章的所有标签。即使它们与3个不同的匹配,也可以有5个标签,其他4个标签,我希望它们包含在每一行中。像“标签,标签,标签”或者我可以在一些“标签”列中解析的东西。
有什么想法吗?我无法找到解决方法......
答案 0 :(得分:3)
您需要将查询作为子查询加入,该查询返回所有标记并将其与GROUP_CONCAT()
合并。
select a.*, GROUP_CONCAT(DISTINCT t.caption) tags
from (select distinct a.*
from articles a
JOIN article_tags a_t on a_t.article_id = a.id
JOIN tags t on t.id = a_t.tag_id
WHERE t.caption IN ('fire', 'water', 'earth')
GROUP BY a.id
HAVING COUNT(DISTINCT t.caption) = 3) a
JOIN article_tags a_t on a_t.article_id = a.id
JOIN tags t on t.id = a_t.tag_id
GROUP BY a.id
顺便说一句,没有理由在查询中使用LEFT JOIN
,因为您只关心tags
中匹配的行。
我也想知道DISTINCT
中COUNT()
的必要性 - 你真的允许多个标签ID使用相同的标题吗?