لقد صادفت اليوم المهمة التالية أثناء العمل في مشروع عميل: خذ جدول SQL "المستخدم" مع العمودين "المعرف" و"النتيجة" وحدد قائمة تصنيف لجميع المستخدمين، مرتبة على أساس "النتيجة"، حيث يحصل المستخدمون الذين لديهم نفس النتيجة على نفس الترتيب. باستخدام المتغيرات المعرفة من قبل المستخدم، يمكن حل هذه المهمة بشكل حدسي وسهل.
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 | +--------+-----------+----------+