Maison >base de données >tutoriel mysql >Comment effectuer un classement groupé dans MySQL à l'aide de sous-requêtes et de variables ?

Comment effectuer un classement groupé dans MySQL à l'aide de sous-requêtes et de variables ?

Susan Sarandon
Susan Sarandonoriginal
2025-01-17 19:46:09513parcourir

How to Perform Grouped Ranking in MySQL Using Subqueries and Variables?

Explication détaillée du classement du groupe MySQL

Présentation

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.

Scénario de problème

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

Solution

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>

Explication

Cette requête se déroule étape par étape :

  1. La requête initiale trie d'abord par id_class puis par grade par ordre décroissant.
  2. Les variables temporaires @student et @class sont initialisées à -1.
  3. @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é.
  4. @class se voit attribuer la nouvelle valeur de id_class et sera utilisé pour la prochaine itération de la requête.
  5. Enfin, 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn