MySQL-এ GROUP BY-র ভেতরে সরাসরি ORDER BY ব্যবহার করা যায় না। বরং MAX() বা MIN() অগ্রেগেট ফাংশন ব্যবহার করে একই ফলাফল পাওয়া যায়।
সিনট্যাক্স (MAX() ব্যবহার)
SELECT yourNameColumnName, MAX(yourRankColumnName)
FROM yourTableName
GROUP BY yourNameColumnName;
উদাহরণ দিয়ে বুঝি
টেবিল তৈরি করুন:
mysql> CREATE TABLE MaxDemo (
-> UserId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> UserName VARCHAR(20),
-> UserRank INT
-> );
Query OK, 0 rows affected (0.77 sec)
রেকর্ড ইনসার্ট করুন (Sam-এর দুটি র্যাঙ্ক):
mysql> INSERT INTO MaxDemo(UserName, UserRank) VALUES('Larry', 2);
mysql> INSERT INTO MaxDemo(UserName, UserRank) VALUES('Sam', 1);
mysql> INSERT INTO MaxDemo(UserName, UserRank) VALUES('Sam', 2);
সকল রেকর্ড:
mysql> SELECT * FROM MaxDemo;
+--------+----------+----------+
| UserId | UserName | UserRank |
+--------+----------+----------+
| 1 | Larry | 2 |
| 2 | Sam | 1 |
| 3 | Sam | 2 |
+--------+----------+----------+
3 rows in set (0.00 sec)
প্রতিটি UserName-এর সর্বোচ্চ UserRank বের করুন
mysql> SELECT UserName, MAX(UserRank) FROM MaxDemo GROUP BY UserName;
+----------+---------------+
| UserName | MAX(UserRank) |
+----------+---------------+
| Larry | 2 |
| Sam | 2 |
+----------+---------------+
2 rows in set (0.00 sec)
ব্যাখ্যা: Sam-র দুটি র্যাঙ্ক (১ এবং ২) থাকায় MAX(UserRank) সে ২ রিটার্ন করেছে।
আরও জটিল কেস: নির্দিষ্ট শর্ত অনুযায়ী রো বেছে নেওয়া
যদি গ্রুপের মধ্যে নির্দিষ্ট শর্তের প্রথম/শেষ রো দরকার হয় (যেমন: সর্বোচ্চ র্যাঙ্কের রোয়ের অন্য কলাম), তবে:
MySQL 8.0+ (ROW_NUMBER() উইন্ডো ফাংশন)
WITH Ranked AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY UserName ORDER BY UserRank DESC) AS rn
FROM MaxDemo
)
SELECT UserName, UserRank FROM Ranked WHERE rn = 1;
পুরানো ভার্সন (সাবকোয়েরি/জয়ন)
SELECT m1.UserName, m1.UserRank
FROM MaxDemo m1
JOIN (
SELECT UserName, MAX(UserRank) AS MaxRank
FROM MaxDemo
GROUP BY UserName
) m2 ON m1.UserName = m2.UserName AND m1.UserRank = m2.MaxRank;
সারাংশ: সিম্পল MAX/MIN-এ MAX() ব্যবহার করুন। জটিল কেসে উইন্ডো ফাংশন (MySQL 8.0+) বা সাবকোয়েরি জয়ন ব্যবহার করুন।