Astăzi am dat peste următoarea sarcină în timp ce lucram la un proiect client: Luați un tabel SQL „user” cu coloanele „id” și „score” și stabiliți o listă de clasare a tuturor utilizatorilor, sortată în funcție de „score”, în care utilizatorii cu același scor obțin același clasament. Prin utilizarea variabilelor definite de utilizator, această sarcină poate fi rezolvată intuitiv și ușor.
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)
Utilizarea a două variabile rezolvă acest lucru simplu:
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
și veți obține rezultatul dorit:
+--------+-----------+----------+ | *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 | +--------+-----------+----------+