Σήμερα συνάντησα την ακόλουθη εργασία ενώ εργαζόμουν σε ένα έργο πελάτη: Πάρτε έναν πίνακα 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 | +--------+-----------+----------+