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


Huggy
Réponse acceptée

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

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
Auteur

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

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

tbm
Auteur

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

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