I dag stødte jeg på følgende opgave, mens jeg arbejdede på et kundeprojekt: Tag en SQL-tabel "bruger" med kolonnerne "id" og "score" og bestem en rangliste over alle brugere sorteret efter "score", hvor brugere med få den samme placering med samme score. Denne opgave kan løses intuitivt og let ved hjælp af brugerdefinerede variabler .
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)
Brug af to variabler løser dette enkelt
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
og du får det output, du ønsker
+--------+-----------+----------+ | *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 | +--------+-----------+----------+