Để tìm bản ghi có giá trị lớn nhất ở một cột và lấy giá trị cột khác của bản ghi đó, dùng subquery với MAX() trong mệnh đề WHERE.
Ví dụ minh họa
Tạo bảng sản phẩm:
CREATE TABLE DemoTable (ProductId INT, ProductAmount INT); INSERT INTO DemoTable VALUES (1001, 7895), (1003, 8903), (1010, 7690), (2010, 8450);
Tìm ProductId có ProductAmount lớn nhất:
SELECT * FROM DemoTable WHERE ProductAmount = (SELECT MAX(ProductAmount) FROM DemoTable);
Kết quả
| ProductId | ProductAmount |
|---|---|
| 1003 | 8903 |
Các cách khác
1. ORDER BY + LIMIT 1 (đơn giản, nhanh)
SELECT ProductId, ProductAmount FROM DemoTable ORDER BY ProductAmount DESC LIMIT 1;
2. JOIN với subquery (khi cần nhiều cột từ subquery)
SELECT d.* FROM DemoTable d JOIN (SELECT MAX(ProductAmount) AS max_amt FROM DemoTable) m ON d.ProductAmount = m.max_amt;
3. Window Function (MySQL 8.0+)
SELECT ProductId, ProductAmount
FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY ProductAmount DESC) AS rn
FROM DemoTable
) t
WHERE rn = 1;
So sánh
| Cách | Ưu điểm | Nhược điểm |
|---|---|---|
| Subquery WHERE | Dễ hiểu, ANSI SQL | Quét bảng 2 lần (có thể chậm) |
| ORDER BY LIMIT | Nhanh, dùng index | Chỉ lấy 1 hàng (nếu tie cần xử lý thêm) |
| Window Function | Linh hoạt (top N, tie-break) | Chỉ MySQL 8.0+ |
Khuyên dùng: ORDER BY ... DESC LIMIT 1 cho trường hợp đơn giản; Window Function cho phức tạp.