Aujourd'hui, je suis tombé sur la tâche suivante en travaillant sur un projet client: prendre une table SQL "utilisateur" avec les colonnes "id" et "score" et déterminer un classement de tous les utilisateurs en fonction du "score" dans lequel les utilisateurs avec le obtenir le même classement avec le même score. Cette tâche peut être résolue intuitivement et facilement en utilisant des variables définies par l' utilisateur .
CREATE TABLE user(id INT, score INT); INSERT INTO user(id, score) VALUES (1, 10), (2, 40), (3, 55), (4, 10), (5, 5), (6, 20), (7, 30), (8, 70), (9, 30)
L'utilisation de deux variables résout cela simplement
SET @score_prev = NULL; SET @cur_rank = 0; SELECT id, score, CASE WHEN @score_prev = score THEN @cur_rank WHEN @score_prev := score THEN @cur_rank := @cur_rank + 1 END AS rank FROM user ORDER BY score DESC
et vous obtenez le résultat que vous voulez
+--------+-----------+----------+ | *id* | *score* | *rank* | | 8 | 70 | 1 | | 3 | 55 | 2 | | 2 | 40 | 3 | | 7 | 30 | 4 | | 9 | 30 | 4 | | 6 | 20 | 5 | | 1 | 10 | 6 | | 4 | 10 | 6 | | 5 | 5 | 7 | +--------+-----------+----------+