امروز هنگام کار روی یک پروژه مشتری با کار زیر روبرو شدم: یک جدول 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 | +--------+-----------+----------+