Pour commencer, tu supprimes la ligne 13 du dernier bloc de code et tu définies le jeu de caractères dans le dsn dans la connexion à la base de données.
Sinon, ton sujet concerne plus la base de données que PHP.
Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.
Comment ça "c'est fait" ? Avec la requête ligne 17 de ton code ?
SELECT ecole.id, schools_name, SUM(schools_id)
FROM
ecole
LEFT JOIN eleves
ON ecole.id = eleves.schools_id
GROUP BY ecole.id
Une somme d'ID n'a jamais fais un nombre d'élève ... c'est un COUNT qu'il te faut ...
CyrilleMonstard1 a écrit:
Bonjour, j'aimerais restituer la liste des écoles en affichant pour chacune :
– le nombre d’élèves, (cela est fait). (1)
– le nombre d’élèves pratiquant au moins un sport, (2)
– le nombre d’activités sportives pratiquées, (3)
Il va falloir nous aider un peu ... Nous ne connaissons pas ton projet et tu ne nous dis rien de la structure de la base de données ... Au moins les tables (les colonnes et leur type) ... et tu ne dis pas ce que tu as déjà essayé pour chacun de ces 3 points ...
Sinon côté PHP, PDOstatement::fetchAll t'éviterai ces boucles while inutiles ... et +1 pour mettre le charset dans le DSN ...
-- Nombre d'élèves par école
SELECT
E.id,
E.schools_name,
COUNT(*) AS nb_eleves
FROM
ecole E
INNER JOIN eleves S
ON E.id = S.schools_id
GROUP BY E.id, E.schools_name
Pour la 2, il faut faire un COUNT DISTINCT, pour éviter de compter plusieurs fois les élèves faisant plusieurs sports :
-- Nombre d'élèves avec sport par école
SELECT
S.schools_id,
COUNT( DISTINCT S.id ) AS nb_eleves
FROM
eleves S
INNER JOIN eleves_sports SS
ON S.id = SS.students_id
GROUP BY S.schools_id
Et utiliser cette requête comme sous-requête avec la première si tu veux tout faire en une fois ...
Pour la 3 ... encore un COUNT DISTINCT :
-- Nombre de sports pratiqués par école
SELECT
S.schools_id,
COUNT( DISTINCT SS.sports_id ) AS nb_sports
FROM
eleves S
INNER JOIN eleves_sports SS
ON S.id = SS.students_id
GROUP BY S.schools_id
Et utiliser cette requête comme sous-requête avec la première si tu veux tout faire en une fois ...
Bonjour, je te remercie pour ton aide précieuse, mais j'ai une dernière question, j'aimerais restituer la liste des activités sportives pratiquées classées par ordre croissant en fonction du nombre d’élèves qui les pratiquent et en précisant ce nombre pour chacune des activités. Merci d'avance & bonne soirée
SELECT S.schools_id, SP.sports_name AS liste_sports, COUNT(DISTINCT S.id) AS nb_eleves
FROM eleves AS S
LEFT JOIN eleves_sports AS SS
ON S.id = SS.students_id
LEFT JOIN sports AS SP
ON SS.sports_id = SP.id
GROUP BY S.schools_id, SP.sports_name
Voilà j'ai fait cela, mais je n'arrive pas à afficher dans l'ordre les sports pratiqué en fonction du nombre d'élèves.
SELECT S.schools_id, SP.sports_name AS liste_sports, COUNT(DISTINCT S.id) AS nb_eleves FROM eleves AS S
INNER JOIN eleves_sports AS SS
ON S.id = SS.students_id
INNER JOIN sports AS SP
ON SS.sports_id = SP.id
GROUP BY S.schools_id, SP.sports_name ORDER BY S.schools_id, nb_eleves DESC
Bonjour, ça y est j'ai réussi.
Mais un soucis -> nombre d'élèves pratiquant au moins un sport par école
Je te joint 2 fichiers montrant la table eleves_sports
SELECT S.schools_id,
COUNT(DISTINCT S.id) AS nb_eleves
FROM eleves AS S
INNER JOIN eleves_sports AS SS
ON S.id = SS.students_id
GROUP BY S.schools_id
Concernant cette requête, j'ai la même réponse que -> nombres d'élèves par école
Alors que le résultat devrait être 8 élèves pratiquant au moins un sport.
Il y a 2 élèves qu'ont la valeur NULL.
Merci d'avance & bonne journée
- Edité par CyrilleMonstard1 5 avril 2020 à 11:06:25
les jointures entre tables
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.