Hodiaŭ mi renkontis la jenan taskon laborante pri klienta projekto: Prenu SQL-tabelon "uzanto" kun la kolumnoj "id" kaj "score" kaj determinu rangoliston de ĉiuj uzantoj, ordigitaj laŭ "poentaro", en kiu uzantoj kun la sama poentaro ricevas la saman rangon. Per uzado de uzant-difinitaj variabloj, ĉi tiu tasko povas esti solvita intuicie kaj facile.
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)
Uzi du variablojn solvas ĉi tion simple:
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
kaj vi ricevas la deziratan rezulton:
+--------+-----------+----------+ | *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 | +--------+-----------+----------+