Partage
  • Partager sur Facebook
  • Partager sur Twitter

les jointures entre tables

    31 mars 2020 à 16:06:57

    class postManager {
    
    	private $_bdd;
    
    	public function __construct($bdd) {
    
    		$this->setDb($bdd);
    	}
    
    	public function setDb(PDO $dbh) {
    
    		$this->__bdd = $dbh;
    	}
    
    	public function getSchoolsStudentsNumbers() {
    
    		$query = 'SELECT ecole.id, schools_name, SUM(schools_id)
    		FROM ecole LEFT JOIN eleves ON ecole.id = eleves.schools_id GROUP BY ecole.id';
    
    		$stmnt = $this->__bdd->prepare($query);
    
    		$stmnt->execute();
    
    		while($row = $stmnt->fetch(PDO::FETCH_ASSOC)) {
    
    			$results[] = $row;
    		}
    
    		return $results;
    	}
    
    	public function getSchoolsSportStudentsNumbers() {
    
    		$query = 'SELECT ecole.id, schools_name, SUM(schools_id) FROM ecole LEFT JOIN eleves ON ecole.id = eleves.schools_id';
    
    		$stmnt = $this->__bdd->prepare($query);
    
    		$stmnt->execute();
    
    		while($row = $stmnt->fetch(PDO::FETCH_ASSOC)) {
    
    			$results[] = $row;
    		}
    
    		return $results;
    	}
    }
    require('class/postManager.php');
    
    try {
    
    	$bdd = new PDO('mysql:host=localhost;dbname=ecoles', '10111110', '10111110');
    }
    
    catch(exception $e) {
    
    	die('Erreur ' . $e->getMessage());
    }
    
    $bdd->exec("SET CHARACTER SET utf8");
    
    $manager = new postManager($bdd);
    $results = $manager->getSchoolsStudentsNumbers();
    var_dump($results);
    
    <h1>Voici le nombre d'élèves appartenent à telle école</h1>
    
    <table>
    	<?php if(!empty($results)) : ?>
    		<?php foreach($results as $result) : ?>
    			<thead>
    				<tr>
    					<th>N° Identification</th>
    					<th>Nom de l'école</th>
    					<th>Le nombre d'élèves par école</th>
    				</tr>
    			</thead>
    
    			<tr>
    				<td><?php echo $result['id']; ?></td>
    				<td><?php echo $result['schools_name']; ?></td>
    				<td><?php echo $result['SUM(schools_id)']; ?></td>
    			</tr>
    		<?php endforeach; ?>
    	<?php endif; ?>
    </table>
    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)
    ça coince au niveau (2 et 3 )
    • Partager sur Facebook
    • Partager sur Twitter
      31 mars 2020 à 19:29:48

      Bonjour.

      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.

      • Partager sur Facebook
      • Partager sur Twitter

      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.

        1 avril 2020 à 11:47:14

        Bonjour,

        Déplacement vers un forum plus approprié

        Le sujet est déplacé de la section PHP vers la section Base de données

        • Partager sur Facebook
        • Partager sur Twitter
          1 avril 2020 à 19:33:05

          CyrilleMonstard1 a écrit:

           – le nombre d’élèves, (cela est fait). (1)

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

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            1 avril 2020 à 23:45:51

            bdd -> ecoles

            table -> ecole

            nom des champs -> id, schools_name

            table -> eleves

            nom des champs -> id, students_name, students_name_first, schools_id

            table -> eleves_sports

            nom des champs -> id, students_id, sports_id

            table -> sports

            nom des champs -> id, sports_name

            • Partager sur Facebook
            • Partager sur Twitter
              2 avril 2020 à 12:43:57

              CyrilleMonstard1 a écrit:

              1. le nombre d’élèves
              2. le nombre d’élèves pratiquant au moins un sport
              3. le nombre d’activités sportives pratiquées

              Pour la 1, il faut faire un COUNT, pas un SUM ...

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

              -
              Edité par Benzouye 2 avril 2020 à 12:45:13

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                2 avril 2020 à 16:00:53

                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

                • Partager sur Facebook
                • Partager sur Twitter
                  2 avril 2020 à 19:15:47

                  Et bien au boulot ... je ne vais pas tout te pondre ...

                  Tu as de quoi t'aider dans mon message précédent.

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    2 avril 2020 à 23:00:13

                    OK excuse-moi, je vais voir par moi même, bonne nuit

                    • Partager sur Facebook
                    • Partager sur Twitter
                      3 avril 2020 à 1:18:42

                      Tu peux revenir poster tes avancées pour en rediscuter ...

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                        3 avril 2020 à 16:00:41

                        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.

                        Merci d'avance

                        • Partager sur Facebook
                        • Partager sur Twitter
                          5 avril 2020 à 10:59:46

                          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

                          • Partager sur Facebook
                          • Partager sur Twitter

                          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.
                          • Editeur
                          • Markdown