MySQL **không hỗ trợ** ORDER BY bên trong GROUP BY. Để lấy giá trị "đầu tiên" hoặc "cuối cùng" theo thứ tự nào đó trong mỗi nhóm, dùng hàm tập hợp MAX() hoặc MIN().
Ví dụ minh họa
Tạo bảng xếp hạng user:
mysql> CREATE TABLE MaxDemo (
-> UserId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> UserName VARCHAR(20),
-> UserRank INT
-> );
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);
Dữ liệu (Sam có 2 rank: 1 và 2):
+--------+----------+----------+ | UserId | UserName | UserRank | +--------+----------+----------+ | 1 | Larry | 2 | | 2 | Sam | 1 | | 3 | Sam | 2 | +--------+----------+----------+
Yêu cầu: Lấy rank cao nhất (MAX) của mỗi user
mysql> SELECT UserName, MAX(UserRank) FROM MaxDemo GROUP BY UserName;
Kết quả:
+----------+---------------+ | UserName | MAX(UserRank) | +----------+---------------+ | Larry | 2 | | Sam | 2 | +----------+---------------+
Nếu cần lấy giá trị đi kèm (ví dụ: ngày của rank cao nhất)
MySQL 8.0+: Dùng window function ROW_NUMBER()
WITH ranked AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY UserName ORDER BY UserRank DESC) AS rn
FROM MaxDemo
)
SELECT UserName, UserRank, OtherColumn
FROM ranked WHERE rn = 1;
MySQL 5.7: Dùng self-join hoặc subquery
SELECT m1.UserName, m1.UserRank, m1.OtherColumn
FROM MaxDemo m1
JOIN (
SELECT UserName, MAX(UserRank) AS max_rank
FROM MaxDemo GROUP BY UserName
) m2 ON m1.UserName = m2.UserName AND m1.UserRank = m2.max_rank;
Tóm tắt
- Không có
ORDER BYtrongGROUP BY - Dùng
MAX()/MIN()cho giá trị cực đại - Cần toàn bộ hàng → window function (8.0+) hoặc self-join