যখন একাধিক এন্ট্রিগুলির সমান স্কোর থাকে, পরবর্তী স্থানটি পরপর হওয়া উচিত নয়। পরবর্তী র্যাঙ্কটি একই র্যাঙ্কটি ভাগ করে নেওয়ার সংখ্যা দ্বারা বৃদ্ধি করা উচিত।
এর মতো স্কোর প্রদর্শন করতে দুটি র্যাঙ্ক ভেরিয়েবলের প্রয়োজন
- প্রদর্শনের জন্য র্যাঙ্ক ভেরিয়েবল
- গণনা করার জন্য র্যাঙ্ক ভেরিয়েবল
বন্ধনগুলির সাথে র্যাঙ্কিংয়ের এটি আরও স্থিতিশীল সংস্করণ:
SET @rnk=0; SET @rank=0; SET @curscore=0;
SELECT score,ID,rank FROM
(
SELECT AA.*,BB.ID,
(@rnk:=@rnk+1) rnk,
(@rank:=IF(@curscore=score,@rank,@rnk)) rank,
(@curscore:=score) newscore
FROM
(
SELECT * FROM
(SELECT COUNT(1) scorecount,score
FROM scores GROUP BY score
) AAA
ORDER BY score DESC
) AA LEFT JOIN scores BB USING (score)) A;
আসুন নমুনা ডেটা দিয়ে এটি ব্যবহার করে দেখুন। প্রথমে এখানে নমুনা তথ্য রয়েছে:
use test
DROP TABLE IF EXISTS scores;
CREATE TABLE scores
(
id int not null auto_increment,
score int not null,
primary key (id),
key score (score)
);
INSERT INTO scores (score) VALUES
(50),(40),(75),(80),(55),
(40),(30),(80),(70),(45),
(40),(30),(65),(70),(45),
(55),(45),(83),(85),(60);
নমুনা ডেটা লোড করা যাক
mysql> DROP TABLE IF EXISTS scores;
Query OK, 0 rows affected (0.15 sec)
mysql> CREATE TABLE scores
-> (
-> id int not null auto_increment,
-> score int not null,
-> primary key (id),
-> key score (score)
-> );
Query OK, 0 rows affected (0.16 sec)
mysql> INSERT INTO scores (score) VALUES
-> (50),(40),(75),(80),(55),
-> (40),(30),(80),(70),(45),
-> (40),(30),(65),(70),(45),
-> (55),(45),(83),(85),(60);
Query OK, 20 rows affected (0.04 sec)
Records: 20 Duplicates: 0 Warnings: 0
এর পরে, ব্যবহারকারী ভেরিয়েবলগুলি আরম্ভ করুন:
mysql> SET @rnk=0; SET @rank=0; SET @curscore=0;
Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
এখন, কোয়েরির আউটপুট এখানে:
mysql> SELECT score,ID,rank FROM
-> (
-> SELECT AA.*,BB.ID,
-> (@rnk:=@rnk+1) rnk,
-> (@rank:=IF(@curscore=score,@rank,@rnk)) rank,
-> (@curscore:=score) newscore
-> FROM
-> (
-> SELECT * FROM
-> (SELECT COUNT(1) scorecount,score
-> FROM scores GROUP BY score
-> ) AAA
-> ORDER BY score DESC
-> ) AA LEFT JOIN scores BB USING (score)) A;
+-------+------+------+
| score | ID | rank |
+-------+------+------+
| 85 | 19 | 1 |
| 83 | 18 | 2 |
| 80 | 4 | 3 |
| 80 | 8 | 3 |
| 75 | 3 | 5 |
| 70 | 9 | 6 |
| 70 | 14 | 6 |
| 65 | 13 | 8 |
| 60 | 20 | 9 |
| 55 | 5 | 10 |
| 55 | 16 | 10 |
| 50 | 1 | 12 |
| 45 | 10 | 13 |
| 45 | 15 | 13 |
| 45 | 17 | 13 |
| 40 | 2 | 16 |
| 40 | 6 | 16 |
| 40 | 11 | 16 |
| 30 | 7 | 19 |
| 30 | 12 | 19 |
+-------+------+------+
20 rows in set (0.18 sec)
দয়া করে নোট করুন যে একই স্কোর ভাগ করে নেওয়ার একাধিক আইডি কীভাবে একই পদমর্যাদায় রয়েছে। এছাড়াও লক্ষ করুন যে র্যাঙ্কটি একটানা নয়।
একবার চেষ্টা করে দেখো !!!
(SELECT GROUP_CONCAT(score) FROM TheWholeTable)
সবচেয়ে ভাল উপায় নয়। এবং এটি তৈরি করা সারিটির আকার নিয়ে সমস্যা হতে পারে।