2010-01-02 121 views
42

我正在嘗試爲正在處理的網站創建一個新聞頁面。我決定我想使用正確的MySQL查詢(意思是COUNT(id)和連接,而不是多個查詢或num_rows。)我使用的是一個PDO包裝器,它應該可以正常工作,而且直接通過MySQL CLI應用程序。MySQL多個左連接

基本上我有3張桌子。一個持有這個消息,一個持有評論,一個持有用戶。我的目標是創建一個頁面,顯示新聞帖子標題,正文,作者和日期的所有內容(稍後分頁)。這工作得很好,當我用第二個查詢來獲取用戶名,但後來我決定我寧願使用JOIN。

那麼問題是什麼?好吧,我需要兩個連接。一個是獲取作者的用戶名,另一個是獲取評論的數量。當我簡單地寫作者的用戶名時,所有工作都按預期進行。顯示新聞表中的所有行(有2個)。但是,當我爲評論行添加第二個LEFT JOIN時,我最終只收到一條來自新聞的記錄(請記住,有2條記錄)和COUNT(comments.id)給我2條(它應該顯示1,因爲我有每個帖子的評論。)

我在做什麼錯?爲什麼它只顯示一個新聞帖子,並說有兩個評論,當有兩個新聞帖子,每個新聞帖子都有一個評論?

SELECT news.id, users.username, news.title, news.date, news.body, COUNT(comments.id) 
FROM news 
LEFT JOIN users 
ON news.user_id = users.id 
LEFT JOIN comments 
ON comments.news_id = news.id 

而且,只是爲了確保有關的另一件事,我的左邊加盟的評論是讓所有的職位,無論他們是否有意見或不正確的方式,正確的嗎?或者這是一個正確的加入?哦,最後一件事......如果我將news.news_id = news.id切換到news.id = comments.news_id,我會得到0個結果。

回答

80

你缺少GROUP BY子句:

SELECT news.id, users.username, news.title, news.date, news.body, COUNT(comments.id) 
FROM news 
LEFT JOIN users 
ON news.user_id = users.id 
LEFT JOIN comments 
ON comments.news_id = news.id 
GROUP BY news.id 

的左聯接是正確的。如果你使用INNER或RIGHT JOIN,那麼你不會收到沒有評論的新聞。

+0

你有沒有使用GROUP BY子句?我的菜鳥雙連接不起作用,我試圖找出原因。 – 2014-06-13 21:51:35

+0

謝謝 - 它幫助我解決了一個難以花費3個小時的問題 - 只需幾分鐘即可解決問題 – Muhammad 2015-05-06 19:07:13

+0

非常感謝。也解決了我的問題:)。 – C4u 2016-02-05 10:03:08

7

顯示每個新聞帖子標題的所有詳細信息,即。 「news.id」這是主鍵,您需要使用GROUP BY爲「news.id」

SELECT news.id, users.username, news.title, news.date, 
     news.body, COUNT(comments.id) 
FROM news 
LEFT JOIN users 
ON news.user_id = users.id 
LEFT JOIN comments 
ON comments.news_id = news.id 
GROUP BY news.id