我正在尝试简单的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;
}
答案 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