我已经成功地通过以 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
地点:
- 文章是我要获取的文章,包含 id、标题等...
- tags 是标签列表,带有 id 和标题
- article_tags关系表,包含article_id和tag_id
现在的问题是,匹配后,我想检索每篇文章具有的所有标签。即使它们由 3 个不同的标签匹配,一个可能有 5 个标签,其他 4 个标签,我希望它们包含在每一行中。在某些“标签”列中,诸如“标签,标签,标签”或我可以解析的任何内容。
有什么想法吗?我找不到解决办法...
最佳答案
您需要将查询作为子查询与返回所有标记的查询连接起来,并将它们与 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
,因为您只关心标签
中匹配的行。
我还想知道 COUNT()
中是否需要 DISTINCT
——你真的允许多个标签 ID 具有相同的标题吗?
关于MySQL - 按某些 "tags"选择,包括所有标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18806869/