2012-07-07 91 views
1

我有兩個表。MySQL COUNT查詢加入

第一張表是成員表

MEMBER TABLE 
ID | NAME 
1  | User 
2  | Another User 
3  | Some other User 

,第二個表是朋友

FRIENDS TABLE 
ID | member_id | Friend Name | Notified 
1  | 1   | Friend #1  | 0 
2  | 1   | Friend #1  | 1 
3  | 2   | Friend #1  | 0 
4  | 1   | Friend #1  | 1 
5  | 2   | Friend #1  | 1 

我喜歡做的事情是讓成員表信息,而且還得到總的通知每個成員的朋友。

我直到現在做是

SELECT 
    M.ID 
    M.NAME 
    COUNT(F.notified) 
FROM 
    MEMBER AS M 
LEFT JOIN 
    FRIENDS AS F 
ON 
    F.member_id = M.id 
WHERE 
    F.notified = 1 
GROUP BY 
    M.id 

但是,這不是爲我工作,因爲如果我有沒有通知朋友一員,查詢不會在結果中包括在內。

在上面的代碼中,例如ID 3的成員將不會包含在我的結果中。

有關如何修改該查詢以便返回甚至沒有通知朋友的成員的任何想法?

親切的問候 Merianos尼科斯

回答

3

您可以在這樣一個子查詢做到這一點:

SELECT 
    M.ID, 
    M.NAME, 
    (SELECT COUNT(F.notified) FROM FRIENDS AS F WHERE F.member_id = M.id AND F.notified = 1) AS NUMFRIENDS 
FROM 
    MEMBER AS M 
GROUP BY 
    M.id 
+2

尼斯。但是,您甚至不需要這種方法使用「GROUP BY M.id」。 – 2012-07-07 08:43:31

+0

這將對成員表中的每條記錄運行一個單獨的子查詢,隨着成員表的增長,這可能會很快開始影響性能。 Ypercube的答案是這樣做的更好的方式,因爲它不會有這些問題。 – Braiba 2012-07-07 10:14:29

5

WHERE F.notified = 1條件取消LEFT加入,使得它的工作作爲一個INNER加入。移動條件加盟ON條款:

SELECT 
    M.ID 
    M.NAME 
    COUNT(F.member_id) 
FROM 
     MEMBER AS M 
    LEFT JOIN 
     FRIENDS AS F 
    ON 
     F.member_id = M.id 
    AND 
     F.notified = 1 
GROUP BY 
    M.id ;