Cách đơn giản nhất tìm giá trị lớn thứ 2: sắp xếp giảm dần, bỏ qua 1 hàng đầu (OFFSET 1), lấy 1 hàng (LIMIT 1).
Cú pháp
SELECT * FROM ten_bang ORDER BY cot_so DESC LIMIT 1 OFFSET 1;
Ví dụ minh họa
Tạo bảng và chèn dữ liệu:
CREATE TABLE DemoTable (Value INT); INSERT INTO DemoTable VALUES (1), (2), (4), (204), (5);
Tìm giá trị lớn thứ 2:
SELECT * FROM DemoTable ORDER BY Value DESC LIMIT 1 OFFSET 1;
Kết quả
| Value |
|---|
| 5 |
(Max = 204, Second max = 5)
Các trường hợp cần lưu ý
1. Giá trị trùng lặp (Duplicate max)
Dữ liệu: 10, 20, 20, 15. Cách trên trả về 20 (vẫn là max do trùng).
→ Dùng DISTINCT:
SELECT DISTINCT Value FROM DemoTable ORDER BY Value DESC LIMIT 1 OFFSET 1;
2. MySQL 8.0+: Window Function (chính xác hơn)
SELECT Value FROM (
SELECT Value, ROW_NUMBER() OVER (ORDER BY Value DESC) AS rn
FROM (SELECT DISTINCT Value FROM DemoTable) t
) x WHERE rn = 2;
3. Subquery với MAX (cách cũ)
SELECT MAX(Value) FROM DemoTable WHERE Value < (SELECT MAX(Value) FROM DemoTable);
So sánh hiệu năng
ORDER BY ... LIMIT 1 OFFSET 1: Nhanh nếu có index trên cột sắp xếp.DISTINCT+ ORDER BY: Cần tạo temporary table để distinct → chậm hơn trên dữ liệu lớn.- Window Function: Linh hoạt cho top-N, ranking.
Khuyên dùng: SELECT DISTINCT cot ORDER BY cot DESC LIMIT 1 OFFSET 1 cho trường hợp đơn giản.