Partage
  • Partager sur Facebook
  • Partager sur Twitter

Récupérer des données selon un min d'entrée

    11 mai 2018 à 11:37:24

    Bonjour à tous, j'espère pouvoir trouver de l'aide à mon soucis sur ce forum ^^

    Je suis entrain de concevoir une base de donnée d'une auto école pour mon examen d'informatique mais je bloque sur le fait que je dois uniquement laisser l'utilisateur accorder aux élèves qui ont au moins eu 5 fois 15/20 à 5 cours consécutifs l'accès à leur examen (en gros, lorsque l'utilisateur veut ajouter des élèves à un examen, il ne pourra sélectionner uniquement ceux ayant participer à 5 cours en ayant une note supérieur ou égale à 15/20 sans avoir eu une note inférieur a un autre cours entre ceux-ci) ce qu'il y a, c’est que je ne sais absolument pas quel requête faire pour faire un tri pareil, ça me parait super compliqué et je ne trouve rien qui puisse m'aider alors je vient demander votre aide en espérant que vous saurez m'aider ^^

    • Partager sur Facebook
    • Partager sur Twitter
      11 mai 2018 à 13:00:02

      Bonjour,

      Quel est ton modèle de données actuel ? Quelles tables ? Et comment stockes-tu les données ?

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        11 mai 2018 à 13:29:01

        https://gyazo.com/3144c9e00312b7c879ce81fa24b3d167 Voila pour mon modèle de donnée (sauf si c'est le MCD qu'il faut)

        J'utilise les tables "cours" (pour récupérer les références de l'élève et ses cotes aux cours) et la table "examen pratique" pour récupérer les données en rapport avec la date de l'examen

        Je stock les données en utilisant un formulaire en utilisant la méthode "Post" et un fichier qui doit recevoir ces données pour les envoyer à la BDD MySQL

        • Partager sur Facebook
        • Partager sur Twitter
          11 mai 2018 à 14:12:09

          TerryHaendle a écrit:

          élèves qui ont au moins eu 5 fois 15/20 à 5 cours consécutifs

          Je pense que "le plus simple" serait de faire le calcul en dehors de la base côté application.

          Tu récupères la liste des élèves avec leurs cotes triées par ordre chronologique et tu la traites dans une boucle pour compter les cotes > 15 continues ...

          Je ne vois pas de moyen de faire cela en SQL ou alors dans une procédure stockée ...

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            11 mai 2018 à 16:36:03

            C'est possible à faire en SQL, mais ce n'est pas évident.

            Le résultat doit être trié par utilisateur, et par date. Et on applique un compteur de ligne. Ce compteur prend +1 si la condition de la note >= 15 est vrai, ou revient à 0 si non.

            Ensuite, on pose une condition WHERE pour ne récupérer que les lignes qui ont une valeur de compteur supérieur ou égale à 5.

            Enfin, on fait un  GROUP BY sur les utilisateurs, de façon on ne pas afficher plusieurs fois le même utilisateur si celui-ci a plusieurs séries réussies.

            Le résultat doit ressembler à quelque chose comme ça  (attention code fait de tête et absolument pas testé ! C'est plus une idée qu'une requête à proprement parler )

            SELECT e.*, temp.meilleure_serie
            FROM (
              SELECT re.REF_ELEVE, MAX(row_number) as meilleure_serie
              FROM (
                SELECT e.NUM_ELEVE, IF cote >= 15 THEN @curRow := @curRow + 1 ELSE @curRow := 0 as row_number
                FROM RESULTAT_EXAM as re
                  INNER JOIN EXAMENT_PRATIQUE as ep
                    ON ep.NUM_EXAMENT = re.REF_EXAMENT
                  INNER JOIN ELEVE as e
                    ON e.NUM_ELEVE = re.REF_ELEVE
                  JOIN (SELECT @curRow := 0) r
                ORDER BY re.REF_ELEVE, ep.DATE
              ) as temp
              WHERE temp.row_number >= 5
              GROUP BY re.REF_ELEVE
            ) as temp
              INNER JOIN ELEVE as e
                ON e.NUM_ELEVE = temp.NUM_ELEVE



            -
            Edité par Sebajuste 11 mai 2018 à 16:48:01

            • Partager sur Facebook
            • Partager sur Twitter
              11 mai 2018 à 16:40:33

              Joli ! :soleil:

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                11 mai 2018 à 16:49:49

                Humm pas si joli que ça, je viens déjà d'y trouver un bug :p Lors du select, on trie pas utilisateur. OK. Mais le compteur ne reviendra pas à 0 automatiquement lors du "changement" d'utilisateur.
                • Partager sur Facebook
                • Partager sur Twitter
                  11 mai 2018 à 17:11:44

                  Moins joli :D

                  Moi je serais parti avec un curseur ...

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    12 mai 2018 à 9:50:35

                    Ah oui quand même, c'est encore loiiiiiin de ce que notre professeur nous a appris lol je vais essayer de jeter un coup d'oeil à ça dans le prochain jour quand j'aurai le temps et adapter le code selon mes tables et mes données, merci à vous en tout cas ^^
                    • Partager sur Facebook
                    • Partager sur Twitter
                      19 mai 2018 à 13:26:48

                      Re bonjour, j'ai un peu fouillé et demandé de l'aide a mon professeur et voilà ce que j'ai réussi a faire

                      			$eleves= $bdd->query('SELECT * FROM eleve');
                      			$cotes_temp = $bdd->query('SELECT c.Cote cote, c.RefEleve ref_eleve FROM eleve e INNER JOIN cours c WHERE e.NumEleve = c.RefEleve ORDER BY RefEleve, `Date`');
                      		?>
                      		<form action="Ajouter_Selection_Post.php" method="post">
                      			<p>Ref des élèves: </p>
                      				<select name="RefEleve" type="number">
                      				<?php
                      					while ($eleve = $eleves->fetch())
                      					{
                      						$nbreOK=0;
                      						while ($cote = $cotes_temp->fetch())
                      						{
                      							if ($cote['ref_eleve']=$eleve['NumEleve'])
                      							{
                      								if ($cote['cote']>=15)
                      								{
                      									$nbreOK++;
                      								}
                      								else
                      								{
                      									$nbreOK=0;
                      								}
                      							}
                      							else
                      							{
                      								break;
                      							}
                      						}
                      						if ($nbreOK>=2)
                      						{
                      							?>
                      								<option value= <?php echo $eleve['NumEleve']; ?>><?php echo $eleve['Nom'] . ' ' .$eleve['Prenom']; ?>
                      							<?php
                      						}
                      					}
                      				?>
                      

                      Problème: il récupère uniquement le premier élève et ne fais pas les autres (j'ai vérifié si il affichait correctement les données récupérées avant la boucle et tout est OK a ce niveau),vous avez une idée du souci? Ça fait 2H que je bloque :(

                      • Partager sur Facebook
                      • Partager sur Twitter
                        19 mai 2018 à 16:35:13

                        En PHP je ferais ainsi :

                        <?php
                        	$requete = $bdd->query('
                        		SELECT
                        			c.RefEleve,
                        			c.Cote
                        		FROM
                        			eleve e
                        				INNER JOIN cours c
                        					ON e.NumEleve = c.RefEleve
                        		ORDER BY RefEleve, `Date`'
                        	);
                        	// On stockes les notes dans un tableau
                        	$notes = $requete->fetchAll();
                        	
                        	// Variables de gestion
                        	$noteOk = 15;
                        	$nbOk = 5;
                        	$compteur = 0;
                        	$eligibles = array();
                        	$RefElevePrecedent = 0;
                        	
                        	// On boucle sur les notes
                        	foreach( $notes as $note ) {
                        		// Si nouvel élève on réinitialise le compteur
                        		if( $note['RefEleve'] != $RefElevePrecedent ) {
                        			$compteur = 0;
                        		}
                        		// Si la note est ok on incrémente le compteur
                        		if( $note['Cote'] > $noteOk ) {
                        			$compteur++;
                        		}
                        		// Si le compteur est ok et que l'élève n'est pas déjà identifié on l'ajoute
                        		if( $compteur >= $nbOk && !array_search( $note['RefEleve'], $eligibles ) ) {
                        			array_push( $eligibles, $note['RefEleve'] );
                        		}
                        		// On mémorise l'élève pour la prochaine boucle
                        		$RefElevePrecedent = $note['RefEleve'];
                        	}
                        	// On affiche les RefEleve ok
                        	var_dump( $eligibles );
                        ?>

                        Attention, si un élève à 5 réussites successives mais avec un ou plusieurs échecs après, il sera quand même dans la liste ...

                        -
                        Edité par Benzouye 19 mai 2018 à 16:36:40

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

                        Récupérer des données selon un min d'entrée

                        × 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