Obtenir le résultat de COUNT() même si c'est 0

Par tbm, il y a 10 ans


Bonjour,

J'ai remarqué que beaucoup de personne avait le même souci mais après avoir testé les différentes solutions proposées, je ne trouve pas de solution

Je voudrais afficher le nombre de personnes qui ont commandé un repas pour une date donnée par classe même si y'en a aucun

Ex :

Classe | COUNT --------------- 6ème | 5 5ème | 1 4ème | 9 3ème | 0

J'ai 3 tables

Planning

date | idEleve --------------- 2016-03-07 | 1 2016-03-07 | 2

Eleve

idEleve | idClasse ------------- 1 | 2 2 | 4

Classe

idClasse | nom ------------ 1 | 6ème 2 | 5ème 3 | 4ème 4 | 3ème

J'ai tenté une requête mais seul les classes ou il y'a des élèves qui ont réservé sont affichées

6 réponses

Benjamin Derepas, il y a 10 ans

Tu dois faire une liaison entre les tables dans un premier temps, et je pense que tu dois utiliser les unions, et les group by (pour les classes) , peut être aussi le distinct (pour éviter les doublons).
A quoi ressemble ta requête pour le moment ?

tbm, il y a 10 ans

Bonjour et merci de ton aide.

En adaptant ma requête aux tables que j'ai donné, j'ai ça

SELECT classe.nom, COUNT(planning.date) FROM planning INNER JOIN eleve ON planning.idEleve = eleve.idEleve INNER JOIN classe ON eleve.idClasse = classe.idClasse WHERE date = "2016-03-03" GROUP BY classe.nom

Ca marche mais cela ne me donne pas de 0

Marechoux, il y a 10 ans

Hello,
Et si tu remplaces "inner" par "left" pour tes jointures ?

tbm, il y a 10 ans

J'ai déja essayé mais malheureusement, cela ne fonctionne pas

bidule, il y a 10 ans

Salut,
Il y a peut être une meilleur solution, mais j'aurai fait ainsi.

DROP TEMPORARY TABLE IF EXISTS commandes; CREATE TEMPORARY TABLE Commandes ( SELECT classe.nom, planning.date, COUNT(planning.date) AS nb FROM planning NATURAL JOIN classe NATURAL JOIN eleve WHERE planning.date = "2016-03-07" GROUP BY planning.date, classe.nom ); SELECT classe.nom, CASE WHEN classe.nom = commandes.nom THEN 1 ELSE 0 END AS NbCommande FROM classe LEFT JOIN commandes ON classe.nom = commandes.nom

au final cela ressort ton tableau

nom nbcommande 3eme 1 5eme 1 6eme 0 4eme 0
Huggy, il y a 10 ans

Avec une sous-requête comme ceci

SELECT C.nom, COALESCE(R.nb, 0) AS combien FROM classe C LEFT JOIN ( SELECT E.idClasse, COUNT(*) AS nb FROM eleve E INNER JOIN planning P on E.idEleve = P.idEleve WHERE P.date = '2016-03-13' GROUP BY E.idClasse) AS R ON C.idClasse = R.idClasse

la sous-requête R réalise les count uniquement pour les élèves planifiés
la requète principale utilise un LEFT JOIN entre classe et R pour afficher TOUTES les classes
la fonction COALESCE permet de convertir le NULL en 0 pour les classes vides

nom combien 6eme 0 5eme 1 4eme 0 3eme 1