[RESOLU] problème requête

Eléphant du PHP | 66 Messages

13 nov. 2023, 00:26

bonjour,

j'ai un problème dans ma requête : j'ai le même nombre d'élève dans les école et ceux qui pratique au moins un sport alors que dans les tables qui son renseignées ce n'est pas le cas.
les valeurs données dans les deux cas sont les valeurs des élèvés pratiquants au moins 1 sport.

voici les tables :
table ecole : ecole_id | ecole_nom cle primaire ecole_id
table eleve : eleve_id | ecole_id cle primaire eleve_id et clé etrangere ecole_id
table sport : sport_id | Nomsport cle primaire sport_id
table sporteleve : sporteleve_id | eleve_id | sport_id cle primaire sporteleve_id et cles etrangeres eleve_id et sport_id

voici ma requête :
<?php
        //GROUP BY //instanciation de connexion au serveur
        $db = new PDO('mysql:host=localhost;dbname=statecol', 'root', '');
        $sql = 'SELECT
        ecole.ecole_nom,
        COUNT(DISTINCT eleve.eleve_id) AS nb_eleves,
        COUNT(DISTINCT sporteleve.eleve_id) AS nb_pratiquants
      FROM ecole
      INNER JOIN eleve ON ecole.ecole_id = eleve.ecole_id
      INNER JOIN sporteleve ON sporteleve.eleve_id = eleve.eleve_id
      GROUP BY ecole.ecole_nom';

      // Exécution de la requête
        $stmt = $db->prepare($sql);
        $stmt->execute();


        // Récupération des résultats
        $results = $stmt->fetchAll();
?>

        
        <table>
  <thead>
    <tr>
      <th>École</th>
      <th>Nombre d'élèves</th>
      <th>Nombre d'élèves pratiquant un sport</th>
    </tr>
  </thead>
  <tbody>
    <?php
      foreach ($results as $row) {
        
        echo '<tr>';
        echo '<td>' . $row['ecole_nom'] . '</td>';
        echo '<td>' . $row['nb_eleves'] . '</td>';
        echo '<td>' . $row['nb_pratiquants'] . '</td>';
        echo '</tr>';
      }

    ?>
  </tbody>
</table>

 

Mammouth du PHP | 1949 Messages

14 nov. 2023, 11:39

Hello,

Utilise des sous requète plutot que des jointures.

Si tu veux comprendre teste ta requète sur phpmyadmin sans le groupe et les count, tu verra que le nombre de ligne sera identique
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Eléphant du PHP | 66 Messages

15 nov. 2023, 01:42

merci pour ton retour :

voici les tables
voici les tables :
table ecole : ecole_id | ecole_nom cle primaire ecole_id
table eleve : eleve_id | ecole_id cle primaire eleve_id et clé etrangere ecole_id
table sport : sport_id | sport_nom cle primaire sport_id
table sporteleve : sporteleve_id | eleve_id | sport_id cle primaire sporteleve_id et cles etrangeres eleve_id et sport_id

je veux faire en une requête ou plusieurs

pour chaque école :
nom de l'école
nombre d'élèves
nombre d'élève pratiquant au moins un sport
nombre de sport pratiqué
liste des sports avec le nombre d'élèves pratiquant le sport.

en une requête je n'ai pas trouver la solution avec une dizaine d'heure de recherche.

j'ai presque réussit avec 2 requêtes mais j'ai un problème au niveau de la liste des sports :

voici mes deux requêtes :
// Connexion à la base de données
try {
    $db = new PDO('mysql:host=localhost;dbname=statecol', 'root', '');
} catch (PDOException $e) {
    echo 'Erreur de connexion : ' . $e->getMessage();
    exit();
}

// Requête SQL
$sql = "SELECT e.ecole_id, e.ecole_nom, 
    COUNT(DISTINCT el.eleve_id) AS nombre_eleves,
    COUNT(DISTINCT se.eleve_id) AS nombre_eleves_sportifs,
    COUNT(DISTINCT se.sport_id) AS nombre_activites_sportives
    FROM ecole e
    LEFT JOIN eleve el ON e.ecole_id = el.ecole_id
    LEFT JOIN sporteleve se ON el.eleve_id = se.eleve_id
    GROUP BY e.ecole_id, e.ecole_nom;"    
;

// Exécution de la requête
$stmt = $db->prepare($sql);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);


// Requête SQL1
$sql1 = 
"SELECT
    e.ecole_id,
    e.ecole_nom,
    COUNT(DISTINCT se.sport_id) AS nombre_activites_sportives,
    s.sport_id,
    s.sport_nom,
    COUNT(DISTINCT se.eleve_id) AS nombre_eleves_pratiquant
    
FROM
    ecole e
LEFT JOIN
    eleve el ON e.ecole_id = el.ecole_id
LEFT JOIN
    sporteleve se ON el.eleve_id = se.eleve_id
LEFT JOIN
    sport s ON se.sport_id = s.sport_id
GROUP BY
    e.ecole_id, e.ecole_nom, s.sport_id, s.sport_nom
ORDER BY
    e.ecole_id, nombre_eleves_pratiquant ASC"
;

// Exécution de la requête
$stmt1 = $db->prepare($sql1);
$stmt1->execute();
$result1 = $stmt1->fetchAll(PDO::FETCH_ASSOC);
?>

voici mon code pour l'affichage :
if (count($result) > 0) {
    
    foreach ($result as $row)     {
        //print_r($row);
        echo "<strong>École ID:</strong> " . $row["ecole_id"] . "<br>";
        echo "<strong>École Nom:</strong> " . $row["ecole_nom"] . "<br>";
        echo "<strong>Nombre d'élèves:</strong> " . $row["nombre_eleves"] . "<br>";
        echo "<strong>Nombre d'élèves pratiquant au moins un sport:</strong> " . $row["nombre_eleves_sportifs"] . "<br>";
        echo "<strong>Nombre d'activités sportives pratiquées:</strong> " . $row["nombre_activites_sportives"] . "<br>";
        if (count($result1) > 0) {
           
           echo "<strong>Liste des activités sportives pratiquées classées par ordre croissant :</strong><br><br>";
            
               
                    echo "<strong>Liste des activités sportives pratiquées:</strong><br>";
            
                    //Affichage de la liste des activités sportives pratiquées
                   echo "<ul>";
                   foreach ($result1 as $row1) {                        
                      //print_r($row1);
                        if($row1["nombre_eleves_pratiquant"]>0 ){
                            echo "<li>" . $row1["sport_nom"] . " - Nombre d'élèves pratiquant: " . $row1["nombre_eleves_pratiquant"] . "</li>";
                        }
                     
                    }
                    echo "</ul>";
            
                   // echo "<br>";
                
           
        } else {
            echo "Aucun résultat trouvé.";
        }
        echo "<br>";
voici le résultat à l'affichage :
École ID: 1
École Nom: Ecole_A
Nombre d'élèves: 10
Nombre d'élèves pratiquant au moins un sport: 8
Nombre d'activités sportives pratiquées: 5
Liste des activités sportives pratiquées classées par ordre croissant :

Liste des activités sportives pratiquées:
Natation - Nombre d'élèves pratiquant: 2
Cyclisme - Nombre d'élèves pratiquant: 2
Boxe - Nombre d'élèves pratiquant: 3
Football - Nombre d'élèves pratiquant: 3
Judo - Nombre d'élèves pratiquant: 7
Judo - Nombre d'élèves pratiquant: 4
Football - Nombre d'élèves pratiquant: 4
Boxe - Nombre d'élèves pratiquant: 8
Natation - Nombre d'élèves pratiquant: 8
Cyclisme - Nombre d'élèves pratiquant: 9
Boxe - Nombre d'élèves pratiquant: 2
Cyclisme - Nombre d'élèves pratiquant: 2
Football - Nombre d'élèves pratiquant: 3

École ID: 2
École Nom: Ecole_B
Nombre d'élèves: 15
Nombre d'élèves pratiquant au moins un sport: 14
Nombre d'activités sportives pratiquées: 5
Liste des activités sportives pratiquées classées par ordre croissant :

Liste des activités sportives pratiquées:
Natation - Nombre d'élèves pratiquant: 2
Cyclisme - Nombre d'élèves pratiquant: 2
Boxe - Nombre d'élèves pratiquant: 3
Football - Nombre d'élèves pratiquant: 3
Judo - Nombre d'élèves pratiquant: 7
Judo - Nombre d'élèves pratiquant: 4
Football - Nombre d'élèves pratiquant: 4
Boxe - Nombre d'élèves pratiquant: 8
Natation - Nombre d'élèves pratiquant: 8
Cyclisme - Nombre d'élèves pratiquant: 9
Boxe - Nombre d'élèves pratiquant: 2
Cyclisme - Nombre d'élèves pratiquant: 2
Football - Nombre d'élèves pratiquant: 3

École ID: 3
École Nom: Ecole_C
Nombre d'élèves: 4
Nombre d'élèves pratiquant au moins un sport: 4
Nombre d'activités sportives pratiquées: 3
Liste des activités sportives pratiquées classées par ordre croissant :

Liste des activités sportives pratiquées:
Natation - Nombre d'élèves pratiquant: 2
Cyclisme - Nombre d'élèves pratiquant: 2
Boxe - Nombre d'élèves pratiquant: 3
Football - Nombre d'élèves pratiquant: 3
Judo - Nombre d'élèves pratiquant: 7
Judo - Nombre d'élèves pratiquant: 4
Football - Nombre d'élèves pratiquant: 4
Boxe - Nombre d'élèves pratiquant: 8
Natation - Nombre d'élèves pratiquant: 8
Cyclisme - Nombre d'élèves pratiquant: 9
Boxe - Nombre d'élèves pratiquant: 2
Cyclisme - Nombre d'élèves pratiquant: 2
Football - Nombre d'élèves pratiquant: 3

en faite pour chaque école j'ai l'ensemble des activités pour toute les écoles.

je voudrai uniquement les sport pratiqué par école avec le nombre de pratiquant.
je ne sais pas comment faire pour récupérer uniquement les ligne que je veux pour chaque école

dans l'attente d'une réponse
merci d'avance

Eléphant du PHP | 66 Messages

17 nov. 2023, 23:27

solution trouvé !!!