Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

ORDER BY bên trong GROUP BY trong MySQL? Dùng MAX() thay thế

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 BY trong GROUP 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