Idag stötte jag på följande uppgift när jag arbetade med ett kundprojekt: Ta en SQL-tabell "användare" med kolumnerna "id" och "poäng" och bestäm en rankningslista över alla användare sorterade efter "poäng" där användare med få samma ranking med samma poäng. Denna uppgift kan lösas intuitivt och enkelt med användardefinierade 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)
Att använda två variabler löser detta 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
och du får den effekt du vill ha
+--------+-----------+----------+ | *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 | +--------+-----------+----------+