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