考虑一个标准的规范化多对多标签系统(三个文章,标签,tag_map表)。我想获得一个带有相关文章的标签列表;例如
Tag Article_IDs
tag1 1,5,7
tag2 3,4,5,7,8
.....
我应该如何JOIN
生成此列表?
简单计算tag_map WHERE tag ='something'中行数的简单方法。很糟糕,对于这种方法,我们需要为每个标记单独查询。例如,要生成20个标签的列表,我们需要20个查询(这是不合理的)。我希望这样做是JOIN
的一个查询。
答案 0 :(得分:2)
您可以使用group_concat聚合功能完成此操作。它们在stackoverflow中有很多样本。
SELECT tag.id,
GROUP_CONCAT(post.post_id)
FROM
posts
inner join
post_tag on ...
inner join
tags on ...
GROUP BY tag.id;
答案 1 :(得分:1)
这样的事情应该有效(但这只是Oracle,我不知道其他数据库上的wm_concat()
相当于):
select t.tagname, wm_concat(m.articleid) from tags t, tag_map m where t.id = m.tagid group by t.tagname;
答案 2 :(得分:1)
Select t.Tag, Group_Concat(a.Article_ID)
From tag_map tm
Join tag t on tm.tag_id = t.tag_id
Join articles a on tm.article_id = a.article_id
Group By t.Tag