2010-04-10 3 views
9

J'ai trois tablesComment adhérer à un COUNT d'une table, puis effectuer que COUNT avec un autre REJOIGNEZ

Poster

ID Name 
1 'Something' 
2 'Something else' 
3 'One more' 

Commentaire

ID PostId ProfileID Comment 
1 1  1   'Hi my name is' 
2 2  2   'I like cakes' 
3 3  3   'I hate cakes' 

Profil

ID Approved 
1 1   
2 0   
3 1   

Je veux compter t il commente pour un poste où le profil du commentaire est approuvé

Je peux sélectionner les données de Post, puis joindre un compte à partir de Comment fine. Mais ce nombre devrait dépendre si le profil est approuvé ou non.

Les résultats que je attends est

CommentCount

PostId Count 
1  1 
2  0 
3  1 
+0

est la table 'Profile' 1-1 avec une' comment'? –

+1

Non, un profil pourrait faire beaucoup de commentaires. –

Répondre

11

Vous pouvez utiliser un imbriquée sélectionner comme ceci:

SELECT Post.Id, temp.Count 
FROM Post 
LEFT JOIN 
(SELECT Post.Id, COUNT(Comment.ID) AS Count 
FROM Post 
LEFT JOIN Comment ON Comment.PostId = Post.ID 
LEFT JOIN Profile ON Profile.ID = Comment.ProfileID 
WHERE Profile.Approved = 1 
GROUP BY Post.Id) 
temp ON temp.Id = Post.ID 

qui vous donnera Null où il n'y a pas de messages, plutôt que pas d'enregistrement:

1 1 
2 null 
3 1 

Juste pour améliorer, vous pourrait utiliser un si pour se débarrasser des nulls

SELECT Post.Id, if(temp.Count >= 1,temp.Count,0) as newCount 
FROM Post 
LEFT JOIN 
(SELECT Post.Id, COUNT(Comment.ID) AS Count 
FROM Post 
LEFT JOIN Comment ON Comment.PostId = Post.ID 
LEFT JOIN Profile ON Profile.ID = Comment.ProfileID 
WHERE Profile.Approved = 1 
GROUP BY Post.Id) temp ON temp.Id = Post.ID 

Qui vous donnait ce que vous vouliez:

1 1 
2 0 
3 1 

Note: Il y a probablement une solution plus élégante cependant !!!!

+0

Bon travail. Je vous remercie! –

1
SELECT Post.Id, COUNT(Comment.ID) AS Count 
FROM Post 
LEFT JOIN Comment ON Comment.PostId = Post.ID 
LEFT JOIN Profile ON Profile.ID = Comment.ProfileID 
WHERE Profile.Approved = 1 
GROUP BY Post.Id 

Probablement vous ne l'avez pas coller à cause de l'exemple, mais vous pourriez évaluer à dénormaliser la table Profile avec le Comment, en déplaçant la colonne Approved dedans.

+0

C'est une bonne idée! Bien que cela signifierait plus de codage pour s'assurer que les tables ont été maintenues à jour quand un profil a été approuvé et suspendu. De même, comment obtenez-vous que les noms de tables apparaissent en code dans votre commentaire? –

+0

utilisez votre ~ clé, 'Luke' – jonny

+0

Cela me donne le compte correct, mais seulement pour' Posts' qui ont eu 'Comments'.Je dois retourner tous les «Messages» avec leurs comptes, même s'ils n'ont pas eu de commentaires. Toutes mes excuses que je n'ai pas clairement fait comprendre au début. –

4

De la définition de la fonction COUNT:

La fonction COUNT ne compte les enregistrements dans lesquels le champ les supports est NOT NULL.

Cela signifie que externe simple, joindre comme cela fonctionnerait:

SELECT Post.ID, COUNT(Comment.ID) 
    FROM Post LEFT JOIN Comment ON (Post.ID = Comment.PostId) 
      LEFT JOIN Profile ON (Profile.ID = Comment.ProfileID AND 
            Profile.Approved = 1) 
GROUP BY Post.ID 
+0

Cela ne fonctionne pas non plus, il retourne seulement deux lignes. J'ai besoin que toutes les lignes soient retournées même si le 'COUNT' est nul. –

+0

Désolé, bien sûr, il ne - voir comment j'ai bougé la condition sur le profil.Approuvé pour le réparer ... – topchef

+2

+1 Cela devrait être la réponse. –