2011-10-07 161 views
0

我有3個不同的表格:SQL從多個表中獲取數據

消息,評論和頭像。

我想要做的是以下幾點: 獲取數據庫中的所有消息,計算每條消息的評論並顯示每個用戶的頭像。

這是怎樣的表內置:

消息 - > messages_id,USER_ID,標題,消息

評論 - > comments_id,messages_id,評論

阿凡達 - > avatar_id,USER_ID,頭像

我試過如下:

SELECT *, COUNT(comments.comments_id) AS commentCount 
FROM messages 
LEFT JOIN comments ON messages.messages_id = comments.messages_id 
LEFT JOIN avatar on messages.user_id = avatar.user_id 

但我得到的消息只有一行,其餘不可見。

任何想法我在這裏做錯了嗎?

回答

1

您需要使用GROUP BY

SELECT messages_id 
     , title 
     , message 
     , user_id 
     , avatar_id 
     , avatar 
     , count(*) as commentCount 
    FROM messages 
    inner join avatar on messages.user_id = avatar.user_id 
    left join comments on messages.messages_id = comments.messages_id 
GROUP BY messages_id 

這應該工作,如果:

  • messages_idmessages
  • user_id獨特的獨特之處avatar

否則你需要指定fy你想得到的價值。

編輯:

我寫inner joinavatar表中所有用戶想擁有一個化身。如果這不是真的,應該是left join就像在你的查詢。

第二次嘗試

也許錯誤是,group by應該messages.messages_id而不是messages_id。事實上,在其他RDMBS這是一個錯誤:

ERROR: column reference "messages_id" is ambiguous

我會更精確:

SELECT m.messages_id as id 
     , min(m.title)  as title 
     , min(m.message) as message 
     , min(m.user_id) as user_id 
     , min(a.avatar_id) as avatar_id 
     , min(a.avatar) as avatar 
     , count(c.comments_id) as commentCount 
    FROM messages as m 
    left join avatar as a on m.user_id = a.user_id 
    left join comments as c on m.messages_id = c.messages_id 
GROUP BY m.messages_id 

所有min可以在MySQL如果你確定要刪除,只有一個值。在標準SQL中,如果只有一個可以鍵入minmax,則必須選擇所需的值。

我更換頭像加入爲left join。可能不是所有用戶都有頭像。

+0

感謝大衛的回覆。但我仍然只獲得一條消息,而不是我在數據庫中的兩條消息。 Messages_id在消息中確實是唯一的,並且user_id在頭像中是唯一的。 也許我需要指定並非所有的郵件都有評論。 – moonwalker

+0

@moonwalker檢查我寫的第二個查詢。如果不起作用有一個表格數據,預期輸出和實際輸出的例子。 – DavidEG

+0

非常感謝大衛。你的第二個解決方案很好。我要研究它並試圖理解我做錯了什麼。 – moonwalker