Сегодня, работая над клиентским проектом, я столкнулся со следующей задачей: возьмите таблицу SQL «пользователь» со столбцами «id» и «score» и определите список ранжирования всех пользователей, отсортированных по «score», в котором пользователи с получить тот же рейтинг с одинаковым счетом. Эту задачу можно легко и интуитивно решить с помощью пользовательских переменных .
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)
Использование двух переменных решает эту проблему просто
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
и вы получите желаемый результат
+--------+-----------+----------+ | *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 | +--------+-----------+----------+