Repartir les données de la table SQL

safowan Messages postés 174 Date d'inscription   Statut Membre Dernière intervention   -  
jee pee Messages postés 41521 Date d'inscription   Statut Modérateur Dernière intervention   -
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 :)
A voir également:

4 réponses

jee pee Messages postés 41521 Date d'inscription   Statut Modérateur Dernière intervention   9 720
 
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   Statut Membre Dernière intervention   6
 
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 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour,
il suffit probablement d'ajouter une requête UPDATE au travail que tu as réalisé.
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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 41521 Date d'inscription   Statut Modérateur Dernière intervention   9 720
 
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