2012-01-03 24 views
3

我試圖提取有關每個用戶組的信息,同時計算每個用戶組中的用戶數量。 計數工作,但是如果一個組不包含任何用戶,它不檢索信息 - 它只是被忽略。顯示組中的用戶數量,甚至是空組

這是我的查詢:

SELECT 
     g.*, 
     count(u.username) as total, 
     u.usergroup 
    FROM 
     usergroups as g, 
     users as u 
    WHERE 
     u.usergroup = g.g_id 
    GROUP BY 
     g.group_name 

這是我的「用戶」和「用戶組」表的一部分:

Sample usergroups table structure 
    +--------------------------+---------------+ 
    | Field     | Type   | 
    +--------------------------+---------------+ 
    | g_id      | int(10)  |<- the user group's ID. 
    | group_name    | varchar(255) |<- the name of the user group 
    +--------------------------+---------------+ 

    Sample users table structure 
    +--------------------------+---------------+ 
    | Field     | Type   | 
    +--------------------------+---------------+ 
    | id      | int(10)  |<- the user ID 
    | username     | varchar(255) |<- the username 
    | usergroup    | int(10)  |<- ID of the user group the user is in 
    +--------------------------+---------------+ 

我不知道我錯過了 - 但隨後再一次,我對更復雜的查詢是非常新的(如果你可以稱之爲)。

任何幫助將不勝感激!

回答

8

你想要一個left join,和你正在做的inner join

SELECT 
     g.*, 
     count(u.username) as total, 
     u.usergroup 
    FROM 
     usergroups as g 
     left join users as u on 
      g.u_id = u.usergroup 
    GROUP BY 
     g.u_id, 
     g.group_name 

現在,我中有你的關注,我想花一分鐘來討論什麼加盟條件。看,當你第一次學習MySQL時,他們會教你使用的語法。嘿,它對於某些問題很有用。不幸的是,它會導致你將「連接條件」與「where謂詞」等同起來,這是一個問題。

在這種情況下,我們說,「嘿,MySQL的,搶我所有的東西都拿了出來usergroups表,並試圖找到一個匹配的users表,其中來自usergroupsu_id列從等於usergroupusers。如果你找不到任何東西,沒關係,無論如何都要把usergroup弄回去,並且把users帶到桌子上的那些列空出來。「

以前,你說,「嘿,MySQL的,搶我所有的東西都拿了出來usergroupsusers表,但只有其中來自usergroupsu_id列匹配從usersusergroup列。」

如果您有相關inner join語法做到了,就像這樣:

SELECT 
     g.*, 
     count(u.username) as total, 
     u.usergroup 
    FROM 
     usergroups as g 
     inner join users as u on 
      g.u_id = u.usergroup 
    GROUP BY 
     g.u_id, 
     g.group_name 

你會一直在說,「嘿,MySQL的,搶了我一切從usergroups表,然後去發現一切都在users桌上擺着u_id等於usergroup。如果沒有找到匹配的,我不希望看到用戶組的結果中顯示。

所以,要清楚,在這裏謂詞過濾結果集,而j oin條件地圖一個表到另一個。

+0

呵呵,沒想到做一個左連接。 會試一試並回報:)。 乾杯。 – MrE 2012-01-03 18:38:46

+0

完美! - 左加入是答案:) - 乾杯! 一旦我可以,將這個標記爲答案。 – MrE 2012-01-03 18:42:57

+0

哦!非常感謝您的詳細解釋。現在變得更有意義了。埃裏克,非常感謝你花時間詳細說明! – MrE 2012-01-03 18:47:23

3

您需要使用LEFT,而不是在這裏加入你的隱式INNER JOIN的:

SELECT 
     g.*, 
     count(u.username) as total, 
     u.usergroup 
    FROM 
     usergroups as g 
    LEFT JOIN users as u ON g.g_id = u.usergroup 
    GROUP BY 
     g.group_name 
+0

完美 - 非常感謝您的幫助。 讚賞:)! – MrE 2012-01-03 18:44:35

相關問題