2012-09-05 92 views
0

我試圖讓簡單的mysql選擇查詢標籤,我有3個表選擇查詢來獲取每POST_ID

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; 
} 
+1

那是因爲你按POST_ID –

+0

是的,否則會爲每個標籤打印「發佈」? – InTry

+1

然後你可能需要像GROUP_CONCAT這樣的東西來聚合所有標籤的值。 [爲您的查詢添加了一個答案和建議] –

回答

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 

這會給你一個記錄每個職位有逗號分隔每一個鏈接到那個帖子標記名的列表。

+0

我不能使它的工作,我仍然只得到一個標籤專業文章 – InTry

+0

你可以顯示查詢的一些輸出? –

+0

我做到了,第一篇文章已被編輯 – InTry

1

您的查詢是按post_id分組的。在其他數據庫中,這會導致錯誤。在MySQL中,這被認爲是一個稱爲隱藏列的功能。

您獲得的值不能保證來自同一行(儘管實際上認爲它們是這樣做的)。您probaly想是這樣的:

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