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

Lấy bản ghi thứ 2 từ cuối (second last) trong MySQL

Tóm tắt

Dùng subquery: sắp xếp DESC LIMIT 2 lấy 2 hàng cuối, rồi sắp xếp ASC LIMIT 1 lấy hàng đầu của tập con đó (là hàng倒数第二).

Cú pháp

SELECT * FROM (
    SELECT * FROM bang ORDER BY id_cot DESC LIMIT 2
) AS t
ORDER BY id_cot LIMIT 1;

Ví dụ

1. Tạo bảng 10 hàng

CREATE TABLE lastRecordBeforeLastOne (
    Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    Name VARCHAR(20) DEFAULT 'John',
    Age INT DEFAULT 18
);
INSERT INTO lastRecordBeforeLastOne (Name, Age) VALUES
('Larry',23), ('Mike',19), ('Sam',24), ('Bob',26),
('David',22), ('James',29), ('Carol',21), ('Maxwell',29), ('Chris',25);
-- Id 1 là DEFAULT (John,18)

2. Truy vấn

SELECT * FROM (
    SELECT * FROM lastRecordBeforeLastOne ORDER BY Id DESC LIMIT 2
) AS t
ORDER BY Id LIMIT 1;

3. Kết quả

+----+---------+------+
| Id | Name    | Age  |
+----+---------+------+
| 9  | Maxwell | 29   |
+----+---------+------+

Id 10 là cuối, Id 9 là倒数第二.

Cách thay thế (MySQL 8.0+)

-- ROW_NUMBER
SELECT * FROM (
    SELECT *, ROW_NUMBER() OVER (ORDER BY Id DESC) AS rn
    FROM lastRecordBeforeLastOne
) t WHERE rn = 2;

-- LIMIT offset (nếu biết số lượng)
SELECT * FROM lastRecordBeforeLastOne ORDER BY Id DESC LIMIT 1, 1;
-- LIMIT 1, 1 = bỏ 1 hàng đầu (offset 1), lấy 1 hàng

Lưu ý

  • Cần cột xác định thứ tự (PK, created_at).
  • Subquery cách cũ tương thích mọi version.
  • LIMIT 1, 1 (offset 1, count 1) ngắn gọn nhất nếu biết chắc có ≥ 2 hàng.