Σήμερα συνάντησα την ακόλουθη εργασία ενώ εργαζόμουν σε ένα έργο πελάτη: Πάρτε έναν πίνακα SQL "user" με τις στήλες "id" και "score" και καθορίστε μια λίστα κατάταξης όλων των χρηστών, ταξινομημένη βάσει "score", στην οποία οι χρήστες με την ίδια βαθμολογία λαμβάνουν την ίδια κατάταξη. Με τη χρήση μεταβλητών που ορίζονται από το χρήστη, αυτή η εργασία μπορεί να λυθεί διαισθητικά και εύκολα.
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)
Η χρήση δύο μεταβλητών λύνει αυτό απλά:
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
και παίρνετε την έξοδο που θέλετε:
+--------+-----------+----------+ | *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 | +--------+-----------+----------+