选择查询以获取每个post_id的标签

时间:2012-09-05 13:50:16

标签: mysql select join group-by

我正在尝试简单的mysql选择查询,我有3个表

post: post_id...
tags: tag_id, tag_name
post_tag: id_post, id_tag

我写了这个查询:

$sql=mysql_query("select * from post 
LEFT JOIN post_tag 
ON post_tag.id_post = post.post_id
LEFT JOIN tags
ON post_tag.id_tag = tags.tag_id    
GROUP BY post_id
ORDER BY post_id 
DESC LIMIT 5");    

但即使有更多带有相同post_id的标签,我每个帖子只能获得一个标签?

while($row=mysql_fetch_array($sql)) 
{
  $post_id =$row['post_id '];           
  $tag_name=$row['tag_name'];

  echo $post_id $tag_name;
}   

2 个答案:

答案 0 :(得分:3)

您可以使用以下内容:

SELECT post_id, GROUP_CONCAT(tag_name) AS tag_name FROM post 
LEFT JOIN post_tag 
ON post_tag.id_post = post.post_id
LEFT JOIN tags
ON post_tag.id_tag = tags.tag_id    
GROUP BY post_id
ORDER BY post_id 
DESC LIMIT 5

这将为每个帖子提供一条记录,其中包含链接到该帖子的每个标记名的逗号分隔列表。

答案 1 :(得分:1)

您的查询是按post_id分组的。在其他数据库中,这会导致错误。在MySQL中,这被认为是一个名为隐藏列的功能。

您获得的价值不能保证来自同一行(尽管实际上认为他们这样做)。你可能想要这样的东西:

select *
from post LEFT JOIN
     post_tag 
     ON post_tag.id_post = post.post_id LEFT JOIN
     tags
     ON post_tag.id_tag = tags.tag_id    
ORDER BY post_id 
DESC LIMIT 5

但是,如果您只想在帖子上添加标签,可以考虑使用gruop_concat:

select post_id, group_concat(tag.tag_name separator ',') as tags
from post LEFT JOIN
     post_tag 
     ON post_tag.id_post = post.post_id LEFT JOIN
     tags
     ON post_tag.id_tag = tags.tag_id
group by post_id