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 を持つタグが複数ある場合でも、投稿ごとに 1 つのタグしか取得できませんか?

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

これにより、投稿ごとに1つのレコードが作成され、その投稿にリンクされているすべてのタグ名のコンマ区切りのリストが表示されます。

于 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 に答える