Repartir les données de la table SQL

Fermé
safowan Messages postés 174 Date d'inscription lundi 25 juin 2007 Statut Membre Dernière intervention 22 juin 2022 - 22 juin 2022 à 14:27
jee pee Messages postés 40458 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 18 novembre 2024 - 23 juin 2022 à 09:03
Bonjour,
Je suis entrain de réaliser une petite application qui me permet, après avoir rempli la table eleve par les Noms, Prénoms et Moyennes des élèves, de les répartir en un nombre des classes donné.

Exemples :
Si je donne 3 pour nombre de classes alors l'application m'affiche 3 tableaux contenant des nombres presque identiques d'élèves avec la condition de répartition est par moyenne : Le 1er sera en classe1, le 2ème en classe2, le 3eme en classe3, puis le 4ème reviens à la classe1, le 5ème en classe2, ...

Si je donne 2 pour nombre de classes alors l'application m'affiche 2 tableaux contenant des nombres presque identiques d'élèves avec la condition de répartition est par moyenne : Le 1er sera en classe1, le 2ème en classe2, puis le 3ème reviens à la classe1, le 4eme en classe2, le 5ème en classe1, le 6ème en classe2, ...

Malheureusement, je n'ai pu qu'afficher toutes les données ensemble, sans avoir l'idée de les répartir en classes lors de l'affichage.

Puis-je avoir une idée svp ? Merci d'avance pour votre aide :)

4 réponses

jee pee Messages postés 40458 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 18 novembre 2024 9 420
Modifié le 22 juin 2022 à 15:30
Bonjour,

Une proposition à affiner, je ne suis pas très expert en mysql, et ne possède pas de quoi tester ce code.

Partir du rang des élèves, en utilisant une variable (il existe une fonction row_num() à partir de mysql 8)
select nom, moyenne, (@rownum := @rownum + 1) as rang
from eleve, (select @rownum := 0) r
order by moyenne desc

puis utiliser la fonction modulo sur le rang pour déterminer la classe, ici pour 3 classes, on a comme résultat 0,1,2
select nom, moyenne, (@rownum := @rownum + 1) % 3 as classe
from eleve, (select @rownum := 2) r
order by moyenne desc 


1
safowan Messages postés 174 Date d'inscription lundi 25 juin 2007 Statut Membre Dernière intervention 22 juin 2022 6
22 juin 2022 à 22:10
Merci pour la réponse Jee Pee :)
J'ai essayé de changé la requête, en suivant vos consignes, mais toujours, je ne reçoit pas la table répartis en 3 sous tables. Plutôt la table de la base est copiée 3 fois.
Voile mon code PHP :
<?php
	mysql_connect("localhost","root","");
	mysql_select_db("lyceehaffouz");
	
	//$nb=$_POST["nb"];
	$nb=3;
	echo "<table border='0'><tr>";
	for($i=0;$i<$nb;$i++)
	{
		echo "<td><table border='1' align='center'>";
		echo "<tr align='center'><td colspan='2'>Classe N $i</td></tr>";
		echo "<tr>";
		echo "<td><b><center>Nom & Prenom</center></b></td>";
		echo "<td><b><center>Moyenne Annuelle</center></b></td>";
		echo "</tr>";

		//$req = "select * from eleve
		$req = "select nomprenom, moyenne, (@rownum := @rownum + 1) % $nb as classe
				from eleve, (select @rownum := 2) r
				order by moyenne desc";
		$res = mysql_query($req);
		while ($tab = mysql_fetch_row($res))
		{
			echo "<tr>";
			echo "<td>$tab[0]</td>";
			echo "<td>>$tab[1]</td>";
			echo "</tr>";
		}
		echo "</table></td>";
	}
	echo "</tr></table>";
?>
0
yg_be Messages postés 23337 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 novembre 2024 Ambassadeur 1 551
22 juin 2022 à 14:56
bonjour,
il suffit probablement d'ajouter une requête UPDATE au travail que tu as réalisé.
0
jordane45 Messages postés 38290 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 18 novembre 2024 4 704
22 juin 2022 à 15:01
Bonjour,

Ce n'est pas tellement une question propre au langage .. mais plus un problème d'algo je pense ..

En gros,
Tu divises le nombre d'élèves par le nombre de classes voulues

Tu prends le nombre d'elèves et tu fais un modulo sur le nombre trouvé précédemment pour savoir si la division tombe juste ou si tu as des virgules.... si tu as des virgules, tu prendra le nombre arrondi à l'entier supérieur pour la suite..

puis tu boucles sur la liste d'elèves et tu regardes si tu as atteint le nombre obtenu par la division précédente
Si oui.. tu génères un nouveau tableau.

0
jee pee Messages postés 40458 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 18 novembre 2024 9 420
Modifié le 23 juin 2022 à 09:04
D'abord est-ce que en sql pur, la requête fonctionne, avant de la mettre en php, puisque c'était une proposition de ce que j'aurais essayé de faire ?

Après en php, et une seule requête, tu auras toujours un seul résultat. Si tu veux des séparations, il faut que tu gères une rupture, je ne sais pas comment, probablement en faisant non pas un traitement global du résultat, mais un traitement ligne par ligne et comparant à la ligne précédente pour savoir si on change de classe.

Pour avoir le résultat trié par classe, on pourrait rajouter un niveau de select :
select nomprenom, moyenne, classe from (select nomprenom, moyenne, (@rownum := @rownum + 1) % 3 as classe
    from eleve, (select @rownum := 2) r
    order by moyenne desc)
order by classe asc, moyenne desc


NB : dans
@rownum := 2
2 est lié au nombre de classe, 3-1, donc là aussi il te faudrait utiliser la variable nb

0