Mysql 选择查询以获取每个post\u id的标签
我正在尝试进行简单的mysql选择查询,我有3个表Mysql 选择查询以获取每个post\u id的标签,mysql,select,join,group-by,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 GRO
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");
但我得到的每一个职位只有一个标签,即使有更多的标签与相同的职位id
while($row=mysql_fetch_array($sql))
{
$post_id =$row['post_id '];
$tag_name=$row['tag_name'];
echo $post_id $tag_name;
}
您可以使用以下内容:
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
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
这将为每篇文章提供一条记录,其中包含链接到该文章的每个标记名的逗号分隔列表。您可以使用以下内容:
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
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
这将为每篇文章提供一条记录,其中包含链接到该文章的每个标记名的逗号分隔列表。您的查询是按文章id分组的。在其他数据库中,这将导致错误。在MySQL中,这被认为是一种称为隐藏列的功能 您得到的值不能保证来自同一行(尽管在实践中认为它们来自同一行)。你可能想要这样的东西:
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
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
但是,如果您只想在一个POST上添加标签,您可以考虑使用GRUOPYCONTAT:
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
您的查询正在按post_id分组。在其他数据库中,这将导致错误。在MySQL中,这被认为是一种称为隐藏列的功能 您得到的值不能保证来自同一行(尽管在实践中认为它们来自同一行)。你可能想要这样的东西:
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
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
但是,如果您只想在一个POST上添加标签,您可以考虑使用GRUOPYCONTAT:
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
这是因为您按post_idiep分组,否则它将为每个标记打印“post”?然后您可能需要类似group_CONCAT的内容来聚合所有标记的值。[为您的查询添加了一个带有建议的答案]这是因为您按post\u idyep分组,否则它将为每个标记打印“post”?然后您可能需要类似group\u CONCAT的内容来聚合所有标记的值。[为您的查询添加了一个带有建议的答案]我无法让它工作,我仍然只收到一个标签pro POST我在我的答案中更新了查询(我给了组_CONCAT()一个别名,这样您就可以使用它)您是男人,非常感谢您它按预期工作。非常感谢。我不能让它工作,我仍然只得到一个标签pro POST我更新了我的答案中的查询(我给了组_CONCAT()一个别名,这样你就可以使用它)你是男人,非常感谢你这是预期的工作。非常感谢。