Heute bin ich bei der Arbeit an einem Kundenprojekt auf folgende Aufgabe gestoßen: Man nehme eine SQL-Tabelle "user" mit den Spalten "id" und "score" und ermittle eine anhand "score" sortierte Rangliste aller Benutzer, in der Benutzer mit der gleichen Punktzahl dasselbe Ranking bekommen. Durch den Einsatz von benutzerdefinierten Variablen kann man diese Aufgabe intuitiv und einfach lösen.
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)
Durch die Verwendung von zwei Variablen wird dies einfach gelöst
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
und man erhält die gewünschte Ausgabe
+--------+-----------+----------+ | *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 | +--------+-----------+----------+