2009-09-13 7 views
0

Ceci est une requête qui est exécutée sans problème avec MySql 5.0.51:requête SQL avec 2 groupant

SELECT cc_split.idSplit, 
     count(voteup.vote), 
     count(votedown.vote) 
FROM cc_split 
LEFT JOIN cc_split_usager AS voteup ON voteup.idSplit = cc_split.idSplit 
     AND voteup.vote >0 
LEFT JOIN cc_split_usager AS votedown ON votedown.idSplit = cc_split.idSplit 
     AND votedown.vote <0 
WHERE cc_split.isArchived = false 
GROUP BY cc_split.idSplit 
LIMIT 0, 30 

Le problème est avec le comte qui n'affiche pas ce que je voudrais avoir. Est-ce que vous pouvez voir, il faut le cc_ split_ usager et devrait compter le nombre de vote qui est positif et d'autre part compter le nombre de voix qui est négatif. Le code ci-dessus affiche le numéro 2 upvote et 2 downvote alors qu'en réalité il devrait être 2 upvote et 1 downvote. Quel est le truc pour avoir dans une seule requête SQL le nombre de upvote et downvote.

Les tableaux ressemblent:

cc_split: 
-idSplit 
-... 
cc_split_usager: 
-idSplit 
-vote (can be +1 or -1) 
-... 

Tout soupçon pour moi?

Répondre

1

Essayez:

SELECT s.idSplit, 
    count(case when v.vote > 0 then 1 else null end) as VoteUp, 
    count(case when v.vote < 0 then 1 else null end) as VoteDown 
FROM cc_split s 
LEFT JOIN cc_split_usager AS v ON v.idSplit = s.idSplit 
WHERE s.isArchived = false 
GROUP BY s.idSplit 
LIMIT 0, 30 
+0

+1 ça marche! Pouvez-vous m'expliquer pourquoi j'ai besoin d'avoir une condition dans le compte? Si vous le pouvez, je vous accepterai automatiquement comme réponse. –

+0

COUNT ne comptera pas les valeurs NULL, donc la condition dit si plus de 1 (pour le vote en hausse) renvoie un 1 (n'importe quelle valeur ferait vraiment), sinon retourne une valeur NULL. Le CASE est équivalent à une instruction de type IF ou SWITCH en fonction de la manière dont il est utilisé. – RedFilter

+0

C'est parce que count (voteup) et count (voté) vous donnent le même nombre que count (*), qui est le nombre de lignes dans la jointure par groupe. –

1

essayez ceci:

SELECT s.idSplit, 
    Sum(Case When vote > 0 Then 1 Else 0 End) UpVotes, 
    Sum(Case When vote < 0 Then 1 Else 0 End) DownVotes 
FROM cc_split s  
    LEFT JOIN cc_split_usager v 
     ON v.idSplit = s.idSplit   
WHERE s.isArchived = false   
GROUP BY s.idSplit   
LIMIT 0 , 30 
+0

@ La solution d'OrbMan fonctionne parce que COunt ne compte pas les valeurs nulles. et les lignes de l'ensemble de résultats étant agrégées lorsque la valeur de vote est <0 auront des valeurs nulles pour l'expression de cas. Mes travaux parce que j'ajoute les valeurs, et ces lignes ghaveront zéro pour l'expression de cas. –

+0

Je vous donne +1 (j'ai dû enlever 2 parenthèses pour que ça marche). Mais la réponse d'OrbMan a été la première avec plus d'explications, donc il méritait la réponse. Merci +1 –

+0

Merci pour l'information additionnelle! Je comprends mieux comment la SUM et COUNT fonctionne avec les deux de votre exemple :) –