Sot kam hasur në detyrën e mëposhtme gjatë punës për një projekt klienti: Merrni një tabelë SQL "user" me kolonat "id" dhe "score" dhe përcaktoni një listë renditjeje të të gjithë përdoruesve, të renditur në bazë të "score", në të cilën përdoruesit me të njëjtin rezultat marrin të njëjtën renditje. Duke përdorur variabla të përcaktuara nga përdoruesi, kjo detyrë mund të zgjidhet në mënyrë intuitive dhe lehtësisht.
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)
Përdorimi i dy ndryshoreve e zgjidh këtë thjesht:
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
dhe ju merrni prodhimin që dëshironi:
+--------+-----------+----------+ | *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 | +--------+-----------+----------+