我有一张桌子articles,另一张桌子,tags第三张桌子叫article_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一个标签,即使该文章有多个标签也是如此。
japan
显然,这与该WHERE子句有关,但是在这里我无法弄清楚该怎么做- 理想情况下,我会得到一个类似的列表japan,china,korea。这是子查询的地方吗?可以与SQL专家一起提出建议。
WHERE
japan,china,korea
谢谢,马特
您至少可以使用两种方法。一种方法是与表连接两次。您指出的另一种方法是使用子查询。为了简单和易于阅读,我可能会在这里使用子查询。结果查询如下所示:
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;