Explication détaillée du classement du groupe MySQL
Dans certains scénarios, les données doivent être classées en fonction de regroupements plutôt que de s'appuyer uniquement sur un seul champ. Par exemple, supposons qu'il existe une table d'étudiants contenant l'identifiant de l'étudiant, l'identifiant de la classe et les notes comme suit :
ID_STUDENT | ID_CLASS | GRADE |
---|---|---|
1 | 1 | 90 |
1 | 2 | 80 |
2 | 1 | 99 |
3 | 1 | 80 |
4 | 1 | 70 |
5 | 2 | 78 |
6 | 2 | 90 |
6 | 3 | 50 |
7 | 3 | 90 |
Pour classer les élèves de chaque classe en fonction de leurs notes, la requête MySQL suivante peut être utilisée :
<code class="language-sql">SELECT id_student, id_class, grade, @student:=CASE WHEN @class = id_class THEN @student+1 ELSE 1 END AS rn, @class:=id_class AS clset FROM (SELECT @student:= 0) s, (SELECT @class:= 0) c, (SELECT * FROM mytable ORDER BY id_class, grade DESC, id_student ) t</code>
Cette requête contient les étapes suivantes :
Initialisation des variables : Les deux variables utilisateur @student
et @class
sont initialisées à 0.
Traitement ligne par ligne : La requête externe traite chaque ligne de l'ensemble de résultats dans l'ordre spécifié par la clause ORDER BY
(id_class
, grade DESC
, id_student
). Notez que grade DESC
est utilisé dans le tri ici pour garantir que les étudiants ayant des scores élevés soient classés en premier.
Classement au sein du groupe : L'instruction CASE
vérifie si le id_class
actuel est le même que le précédent id_class
(@class
). S'ils sont identiques, ajoutez 1 à @student
; sinon, réinitialisez @student
à 1. Cela garantit que la valeur rn
(classement) est unique au sein de chaque groupe (id_class
).
Affectation groupée : @class
se voit attribuer le id_class
actuel et sera comparé sur la ligne suivante.
Le résultat de cette requête fournira le classement des groupes d'étudiants souhaité :
ID_STUDENT | ID_CLASS | GRADE | RANK |
---|---|---|---|
2 | 1 | 99 | 1 |
1 | 1 | 90 | 2 |
3 | 1 | 80 | 3 |
4 | 1 | 70 | 4 |
6 | 2 | 90 | 1 |
1 | 2 | 80 | 2 |
5 | 2 | 78 | 3 |
7 | 3 | 90 | 1 |
6 | 3 | 50 | 2 |
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!