2008-12-23 6 views
2

Je tente d'obtenir les informations d'une table (jeux) et de compter les entrées dans une autre table (tickets) correspondant à chaque entrée dans la première. Je veux que chaque entrée de la première table soit retournée même s'il n'y a pas d'entrées dans la seconde. Ma question est la suivante:SQL GROUP BY/COUNT même si aucun résultat

SELECT g.*, count(*) 
FROM games g, tickets t 
WHERE (t.game_number = g.game_number 
    OR NOT EXISTS (SELECT * FROM tickets t2 WHERE t2.game_number=g.game_number)) 
GROUP BY t.game_number; 

Qu'est-ce que je fais mal?

Répondre

5

Vous devez faire une gauche rejoindre:

SELECT g.Game_Number, g.PutColumnsHere, count(t.Game_Number) 
FROM games g 
LEFT JOIN tickets t ON g.Game_Number = t.Game_Number 
GROUP BY g.Game_Number, g.PutColumnsHere 

Sinon, je pense que cela est un peu plus clair avec une sous-requête corrélative:

SELECT g.Game_Number, G.PutColumnsHere, 
    (SELECT COUNT(*) FROM Tickets T WHERE t.Game_Number = g.Game_Number) Tickets_Count 
FROM Games g 

Assurez-vous de vérifier le plan de requête confirmez que l'optimiseur l'interprète bien.

+0

Merci beaucoup - Je suis un peu gêné que je ne me suis pas rendu compte que cela aurait dû être une participation à gauche. – Wickethewok

+0

Ne pas être - sql est de marbre. –

+0

La sous-requête peut sembler plus claire pour un penseur orienté non défini, mais il peut exister des différences de performance importantes entre les deux méthodes. Je ne suis pas un expert MySQL, donc je ne sais pas avec certitude, mais je ferais au moins l'expérience avec les deux avant de décider. –

1

"FROM games g, tickets t" est la ligne de problème. Cela effectue une jointure interne. Toute clause where ne peut pas ajouter à cela. Je pense que vous voulez un LEFT OUTER JOIN.

+0

Voir la réponse de Michael. (Ouch, battu de 21 secondes.) – Yuliy

+0

Cette syntaxe de virgule effectue réellement une jointure cartésienne, pas une jointure interne. –

+0

Eh bien, une jointure interne est essentiellement une jointure cartésienne avec une restriction (la clause 'ON') – Yuliy

2

Vous devez en savoir plus sur la façon d'utiliser des jointures dans SQL:

SELECT g.*, count(*) 
FROM games g 
LEFT OUTER JOIN tickets t 
USING (game_number) 
GROUP BY g.game_number; 

Notez que contrairement à certaines marques de bases de données, MySQL vous permet de lister plusieurs colonnes dans la liste de sélection, même si vous ne GROUP BY leur clé primaire. Tant que les colonnes de votre liste de sélection sont dépendant du point de vue fonctionnel dans la colonne GROUP BY, le résultat est sans ambiguïté.

D'autres marques de base de données (Microsoft, Firebird, etc.) vous donnent une erreur si vous répertoriez des colonnes dans la liste de sélection sans les inclure dans GROUP BY ou dans une fonction d'agrégat.

Questions connexes