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

Tìm giá trị lớn thứ 2 (Second Max) trong MySQL với LIMIT OFFSET

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.