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 | +--------+-----------+----------+