使用其标签的GROUP_CONCAT字段获取所有文章

时间:2010-08-26 20:15:33

标签: sql mysql tags

我有一个表articles,另一个tags,第三个叫article_tags。我想制作一个页面,列出特定标签的所有文章。

我的查询如下:

SELECT headline, GROUP_CONCAT(tags.tag_name) AS all_tags FROM articles
LEFT JOIN articles_tags ON articles.article_id = articles_tags.article_id
LEFT JOIN tags ON articles_tags.tag_id = tags.tag_id
WHERE tags.tag_name = 'japan'
GROUP BY articles.article_id

所有返回的文章都只有japan作为标记,即使相关文章有多个标记。

这显然与WHERE条款有关,但我无法弄清楚如何在这里做我想做的事情 - 理想情况下我最终会得到像japan,china,korea这样的列表。这是子查询的地方吗?可以与SQL大师建议。

谢谢, 马特

2 个答案:

答案 0 :(得分:3)

您可以使用至少两种方法。一种方法是两次加入表格。你指出的另一个是使用子查询。为了简单易读,我可能会在这里使用子查询。生成的查询看起来像这样:

SELECT
    headline,
    GROUP_CONCAT(tags.tag_name) AS all_tags
FROM articles
JOIN articles_tags ON articles.article_id = articles_tags.article_id
JOIN tags ON articles_tags.tag_id = tags.tag_id
WHERE articles.article_id IN (
    SELECT articles.article_id
    FROM articles
    JOIN articles_tags ON articles.article_id = articles_tags.article_id
    JOIN tags ON articles_tags.tag_id = tags.tag_id
    WHERE tags.tag_name = 'japan'
)
GROUP BY articles.article_id

这是使用更多JOIN的方法:

SELECT
    a.headline,
    GROUP_CONCAT(t2.tag_name) AS all_tags
FROM articles a
JOIN articles_tags at1 ON a.article_id = at1.article_id
JOIN tags t1 ON at1.tag_id = t1.tag_id AND t1.tag_name = 'tag1'
JOIN articles_tags at2 ON a.article_id = at2.article_id
JOIN tags t2 ON at2.tag_id = t2.tag_id
GROUP BY a.article_id;

答案 1 :(得分:2)

使用EXISTS:

   SELECT a.headline,
          GROUP_CONCAT(t.tag_name) AS all_tags
     FROM ARTICLES a
LEFT JOIN ARTICLES_TAGS at ON at.article_id = a.article_id
LEFT JOIN TAGS t ON t.tag_id = at.tag_id
    WHERE EXISTS(SELECT NULL
                   FROM ARTICLES x
                   JOIN ARTICLE_TAGS y ON y.article_id = x.article_id
                   JOIN TAGS z ON z.tag_id = y.tag_id
                              AND z.tag_name = 'japan'
                  WHERE x.article_id = a.article_id)
 GROUP BY a.article_id

如果您只对与“japan”标签关联的那些感兴趣,则无需在子查询中使用LEFT JOIN。