0

我正在尝试进行简单的 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;
}   
4

2 回答 2

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

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

于 2012-09-05T13:56:03.647 回答
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 
于 2012-09-05T13:56:20.847 回答