2010-02-14 39 views
4

我有三個表。SQL查詢:獲取與帖子關聯的標籤

posts 
| id  | title  | 
+---------+-----------+ 
| 1  | hello  | 
| 2  | goodbye | 
+---------+-----------+ 

posts_tags 
| tag_id | post_id | 
+---------+-----------+ 
| 1  | 1   | 
| 2  | 1   | 
| 2  | 2   | 
+---------+-----------+ 

tags 
| id  | name  | 
+---------+-----------+ 
| 1  | news  | 
| 2  | photos | 
+---------+-----------+ 

我希望能夠選擇的職位,但有這樣的結果

post.id post.title tags 
------------------------------------ 
1   hello   news,photos 
2   goodbye  photos 

喜歡的東西

SELECT *, 
     GROUP_CONCAT(tags.name) AS tags 
FROM posts 
    LEFT JOIN posts_tags 
     ON posts.id = posts_tags.post_id 
    LEFT JOIN tags 
     ON posts_tags.tag_id = tags.id 

似乎不正常工作。請指教,感謝您的時間:)

回答

1

更好的辦法是將標籤額外存儲在帖子表中的字符串中,以防止額外的連接和分組。就像表現非規範化一樣。

+0

我有多種語言的標籤,所以我強迫標準化標籤。你可能有任何其他的建議,我怎麼可以denormalize?如果是這樣,也許我可以開始一個問題 – axsuul

+0

您的架構並不反映國際標籤。你的意思是標籤「照片」在顯示之前會翻譯成不同的語言嗎? 哪裏?在表示層?如果是這樣的話 - 那麼我不會在上面的提案(使用GROUP_CONCAT)和我之間看到任何區別。他們都會以逗號分隔的字符串生成標籤列表。 ps:無論如何,我認爲這些標籤是不適合國際化的實體... – zerkms

+0

是啊我想標籤將被翻譯。我希望爲數據庫中的每個標記存儲不同的翻譯,如果它要被標準化 – axsuul

10

你需要一個GROUP BY條款添加到您的查詢:

SELECT posts.*, 
     GROUP_CONCAT(tags.name ORDER BY tags.name) AS tags 
FROM posts 
    LEFT JOIN posts_tags 
     ON posts.id = posts_tags.post_id 
    LEFT JOIN tags 
     ON posts_tags.tag_id = tags.id 
GROUP BY posts.id 

我也加入到上述GROUP_CONCAT的,爲了得到你指定的順序串聯標籤。

+0

我有同樣的問題,一旦搜索標籤例如,如果我搜索作爲'新聞''照片'標籤被刪除,而不是應該在那裏,你可以請幫助相同,我需要做的。 –

+0

輸出應該是這樣的:post.id post.title標籤 ----------------------------------- - 1 hello新聞,照片 –

相關問題