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 -
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 :)
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:
- Repartir les données de la table SQL
- Fuite données maif - Guide
- Table ascii - Guide
- Table des matières word - Guide
- Supprimer les données de navigation - Guide
- Trier des données excel - Guide
4 réponses
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)
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
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
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é.
il suffit probablement d'ajouter une requête UPDATE au travail que tu as réalisé.
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.
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.
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 :
NB : dans
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 := 22 est lié au nombre de classe, 3-1, donc là aussi il te faudrait utiliser la variable nb
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 :