Сегодня, работая над клиентским проектом, я столкнулся со следующей задачей: возьмите таблицу 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 | +--------+-----------+----------+