如何在规范化数据库中加入tag_map

时间:2011-12-15 12:19:46

标签: mysql database join normalization

考虑一个标准的规范化多对多标签系统(三个文章,标签,tag_map表)。我想获得一个带有相关文章的标签列表;例如

Tag    Article_IDs
tag1   1,5,7
tag2   3,4,5,7,8
.....

我应该如何JOIN生成此列表?

简单计算tag_map WHERE tag ='something'中行数的简单方法。很糟糕,对于这种方法,我们需要为每个标记单独查询。例如,要生成20个标签的列表,我们需要20个查询(这是不合理的)。我希望这样做是JOIN的一个查询。

3 个答案:

答案 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