2014-07-21 126 views
3

我有四個表一對多,在一個查詢中選擇一個和許多

POST - 用戶 - 圖片 - COMMENT

我想檢索所有的帖子,該用戶的信息誰發佈它們,與其關聯的圖像(每個帖子只有一個圖像)和與每個給定帖子相關聯的(列表/數組)註釋。

這是我有:

SELECT * 
FROM post 
LEFT JOIN image 
    ON post.image_id=image.id 
LEFT JOIN user 
    ON user.id=post.user_id 
LEFT JOIN comment 
    ON comment.post_id =post.id 

這幾乎工作,但每個崗位記錄重複其每個許多評論。如何獲得一條記錄及其中的所有評論?

+0

你會想要使用Group_concat,但很難給你一個例子,而不知道字段名稱 –

+3

只是重複的生活。他們很好。 – Strawberry

+0

只是爲了澄清......你現在有一個select語句,它在返回一個帖子的幾條評論,而不是讓每條帖子/評論都是它自己的一行,你寧願將它作爲一條帖子然後一系列評論?如果是這樣......爲什麼? – Twelfth

回答

3

除了*運算符真的效率低下以外,你只能在一個查詢「one post」< =>「many comment」中做不到。每個條目都會合並該帖子及其評論。

您可以使用一個技巧,如GROUP_CONCAT來創建一行「評論」。但它會很奇怪。

一個例子Group_Concat

SELECT p.*, 
    GROUP_CONCAT(image.url SEPARATOR "~") AS image_url, GROUP_CONCAT(comment.text SEPARATOR "#~#") AS comment_text 
    FROM post p 
LEFT JOIN image 
    ON p.image_id=image.id 
LEFT JOIN user 
    ON user.id=p.user_id 
LEFT JOIN comment 
    ON comment.post_id =p.id 

它會給你平均每個職位每個註釋一行粘一個到另一個由「#〜#」。不那麼酷。

我認爲你只需讓它像SQL一樣自然處理。

0

這似乎是一個多個查詢的工作。您可以選擇圖像,然後爲每個圖像選擇註釋,或者您可以選擇圖像,然後選擇所有註釋並在代碼中將它們分組。這些選擇取決於你如何使用它。但是,如果您想遵守關係數據庫設計模式,則需要將其作爲多個查詢來執行此操作。你不能像你正在尋找的那樣返回一個數組。