2012-07-07 7 views
1

J'ai deux tables.Requête MySQL COUNT join jointe

La première table est la table membre

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

et la deuxième table est amis

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 

Ce que je veux faire est d'obtenir les informations de table des membres, mais aussi pour obtenir le total notifié amis pour chaque membre.

Ce que je l'ai fait jusqu'à présent est que

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 

Mais cela ne fonctionne pas pour moi, parce que si j'ai un membre avec des amis non notifiées, la requête n'a pas inclus dans les résultats.

Dans le code ci-dessus par exemple le membre avec ID 3 ne sera pas inclus dans mes résultats.

Une idée sur la façon de modifier cette requête afin de retourner même les membres sans amis notifiés?

Amitiés Merianos Nikos

Répondre

3

Vous pouvez le faire avec une sous-requête de cette façon:

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

Nice. Mais vous n'avez même pas besoin du 'GROUP BY M.id' avec cette approche. –

+0

Cela va exécuter une sous-requête séparée pour chaque enregistrement dans la table des membres, ce qui va probablement commencer à affecter les performances assez rapidement à mesure que la table des membres se développe. La réponse de Ypercube est la meilleure façon de le faire, car elle n'aura pas ces problèmes. – Braiba

5

La condition WHERE F.notified = 1 annule la LEFT rejoindre, faire fonctionner comme INNER rejoindre. Déplacer la condition à la jonction ON clause:

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 ;