2010-04-22 3 views
0

table des utilisateurs:Comment construire cette requête? (Commande par COUNT() et se joindre à la table des utilisateurs)

id-user-other columns 

table scores:

id-user_id-score-other columns 

Ils sont plus d'une des lignes pour chaque utilisateur, mais il n'y a que deux les scores que vous pouvez avoir. (0 ou 1, == victoire ou perte). Donc, je veux sortir tous les utilisateurs classés par le nombre de victoires, et tous les utilisateurs classés par le nombre de pertes. Je sais comment faire cela en passant en boucle à travers chaque utilisateur, mais je me demandais comment le faire avec une requête. Toute aide est appréciée!

Répondre

4

si vous voulez deux sorties dont vous avez besoin de deux requêtes

SELECT u.user, 
COUNT(s.score) as WINS 
FROM users u INNER JOIN scores s 
    ON u.user_id = s.user_id 
WHERE s.score = 1 
GROUP BY u.user_id (and any other columns you need from the user table) 
ORDER BY WINS 

Vous faites alors une autre requête pour les pertes.
Essentiellement, c'est la même chose que la réponse d'Adams, mais sa réponse vous donnera une liste d'utilisateurs classés par victoires, puis classés par pertes. Pour obtenir des pertes, il suffit de changer le s.score = 1 à s.score = 0

+0

+1 parce que vous avez compris ce que l'OP voulait contrairement à moi :-) – bernie

+0

Merci, c'était ce dont j'avais besoin. (J'aimerais pouvoir accepter les deux réponses! Désolé!) – Andrew

0

Essayez quelque chose comme ceci:

SELECT u.user, 
     COALESCE(SUM(s.score), 0) AS WINS, 
     SUM(CASE WHEN s.score = 0 THEN 1 ELSE s.score END) AS LOSSES 
    FROM users u 
     LEFT JOIN scores s 
     ON u.id = s.user_id 
GROUP BY u.user 
ORDER BY WINS, LOSSES 
+0

Je vais essayer ça. Bien que, je voulais dire une requête pour les gagnants et les perdants, pas une pour les deux. Pardon. = /. Ils vont aller sur des pages séparées. :-p. Je vais essayer de modifier cette requête, cependant, je suppose. :-p. – Andrew

+1

Bonne réponse Adam, juste quelques problèmes rapides ... S'il a besoin d'une somme de victoires, vous ne l'avez pas quitté. Si vous le faites, vous pouvez avoir des zéros qui peuvent causer des problèmes mathématiques. En outre, puisque l'instruction case n'est pas encapsulée dans une somme, elle renvoie une ligne par perte par utilisateur. – TerrorAustralis

+0

@Dave: gah, merci. Écrit à la hâte. Fixé maintenant – bernie

Questions connexes