1

我已经成功地通过以 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、标题等...</li>
  • tags是标签列表,带有 id 和标题
  • article_tags一个关系表,带有 article_id 和 tag_id

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

有任何想法吗?我找不到绕过它的方法...

4

1 回答 1

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 具有相同的标题吗?

于 2013-09-14T22:11:57.330 回答