Maison >base de données >tutoriel mysql >Comment effectuer un classement groupé dans MySQL à l'aide de sous-requêtes et de variables ?
En tant qu'administrateur de base de données, vous devrez peut-être classer les éléments dans un ensemble de données groupé. MySQL fournit un moyen pratique d'effectuer un classement groupé en utilisant une combinaison de sous-requêtes et de variables temporaires.
Considérez la forme suivante :
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 |
L'objectif est de classer les élèves au sein de chaque classe, ce qui donne le résultat suivant :
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 |
Pour effectuer un classement de groupe dans MySQL, vous pouvez utiliser la requête suivante :
<code class="language-sql">SELECT id_student, id_class, grade, @student:=CASE WHEN @class = id_class THEN @student+1 ELSE 0 END AS rn, @class:=id_class AS clset FROM (SELECT @student:= -1, @class := -1) s, (SELECT * FROM mytable ORDER BY id_class, grade DESC ) t;</code>
Cette requête se déroule étape par étape :
id_class
puis par grade
par ordre décroissant. @student
et @class
sont initialisées à -1. @class
est utilisé pour déterminer s'il faut entrer dans un nouveau groupe. Si la valeur précédente de @class
stockée dans id_class
est différente de la valeur id_class
actuelle, alors @student
est réinitialisé à 0. Sinon, il est incrémenté. @class
se voit attribuer la nouvelle valeur de id_class
et sera utilisé pour la prochaine itération de la requête. rn
est calculé comme le classement au sein de chaque groupe. Notez que afin de garantir un classement correct, la requête interne doit être triée par id_class
et grade
par ordre décroissant. Cette requête modifiée montre plus clairement comment utiliser les variables pour obtenir un classement de groupe et corrige certaines erreurs logiques dans la requête d'origine pour garantir l'exactitude des résultats du classement. La clé réside dans le jugement conditionnel de l'instruction CASE WHEN
et la mise à jour correcte des variables @student
et @class
.
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!