Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 选择查询以获取每个post\u id的标签_Mysql_Select_Join_Group By - Fatal编程技术网

Mysql 选择查询以获取每个post\u id的标签

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

我正在尝试进行简单的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");    
但我得到的每一个职位只有一个标签,即使有更多的标签与相同的职位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()一个别名,这样你就可以使用它)你是男人,非常感谢你这是预期的工作。非常感谢。