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
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 ?
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
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