امروز در حین کار بر روی یک پروژه مشتری با کار زیر روبرو شدم: یک جدول SQL "user" با ستون های "id" و "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 | +--------+-----------+----------+