امروز هنگام کار روی یک پروژه مشتری با کار زیر روبرو شدم: یک جدول SQL "کاربر" با ستون های "id" و "نمره" بگیرید و یک لیست رتبه بندی از همه کاربران مرتب شده بر اساس "نمره" تعیین کنید که در آن کاربران با رتبه بندی یکسان را با همان امتیاز بدست آورید. این کار با استفاده از متغیرهای تعریف شده توسط کاربر به صورت شهودی و آسان قابل حل است .
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 | +--------+-----------+----------+