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.