Aujourd'hui, je suis tombé sur la tâche suivante en travaillant sur un projet client : prenez une table SQL "user" avec les colonnes "id" et "score" et déterminez une liste de classement de tous les utilisateurs, triés en fonction du "score", dans laquelle les utilisateurs avec le même score obtiennent le même classement. En utilisant des variables définies par l'utilisateur, cette tâche peut être résolue de manière intuitive et simple.
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 | +--------+-----------+----------+