小编典典

获取所有带有标签的GROUP_CONCAT字段的文章

sql

我有一张桌子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专家一起提出建议。

谢谢,马特


阅读 280

收藏
2021-04-22

共1个答案

小编典典

您至少可以使用两种方法。一种方法是与表连接两次。您指出的另一种方法是使用子查询。为了简单和易于阅读,我可能会在这里使用子查询。结果查询如下所示:

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;
2021-04-22