MySQL - 按某些“标签”选择,包括所有标签

时间:2013-09-14 22:06:31

标签: mysql

我已成功设法通过以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,标题等...
  • 标记是带有ID和标题
  • 的标记列表
  • article_tags 关系表,包含article_id和tag_id

现在的问题是,在匹配之后,我想要检索每篇文章的所有标签。即使它们与3个不同的匹配,也可以有5个标签,其他4个标签,我希望它们包含在每一行中。像“标签,标签,标签”或者我可以在一些“标签”列中解析的东西。

有什么想法吗?我无法找到解决方法......

1 个答案:

答案 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中匹配的行。

我也想知道DISTINCTCOUNT()的必要性 - 你真的允许多个标签ID使用相同的标题吗?