MySQL ไม่รองรับ ORDER BY ภายใน GROUP BY โดยตรง ใช้ Aggregate Function MAX() หรือ MIN() เพื่อเลือกค่าตามเงื่อนไข
ตัวอย่างการใช้งาน
สร้างตาราง:
mysql> create table MaxDemo (
-> UserId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> UserName varchar(20), UserRank int
-> );
เพิ่มข้อมูล (Sam มี 2 แถว Rank 1 และ 2):
mysql> INSERT INTO MaxDemo(UserName,UserRank) VALUES ('Larry',2),('Sam',1),('Sam',2);
ข้อมูล:
+--------+----------+----------+ | UserId | UserName | UserRank | +--------+----------+----------+ | 1 | Larry | 2 | | 2 | Sam | 1 | | 3 | Sam | 2 | +--------+----------+----------+
GROUP BY UserName ใช้ MAX(UserRank) เลือก Rank สูงสุด:
mysql> SELECT UserName, MAX(UserRank) FROM MaxDemo GROUP BY UserName;
ผลลัพธ์:
+----------+---------------+ | UserName | MAX(UserRank) | +----------+---------------+ | Larry | 2 | | Sam | 2 | +----------+---------------+
กรณีต้องการค่าที่เกี่ยวข้องกับ MAX (เช่น วันที่ล่าสุด)
ใช้ Subquery หรือ JOIN:
SELECT t1.UserName, t1.UserRank, t1.OtherColumn FROM MaxDemo t1 JOIN (SELECT UserName, MAX(UserRank) AS MaxRank FROM MaxDemo GROUP BY UserName) t2 ON t1.UserName = t2.UserName AND t1.UserRank = t2.MaxRank;
MySQL 8.0+: ใช้ Window Function ROW_NUMBER() OVER (PARTITION BY UserName ORDER BY UserRank DESC) แล้วกรอง rn=1