Yêu cầu
Sắp xếp DESC, bỏ qua 2 dòng đầu, lấy 5 dòng tiếp theo.
Giải pháp: ORDER BY ... LIMIT ... OFFSET
Tạo bảng:
CREATE TABLE DemoTable617 (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
FirstName VARCHAR(100)
);
INSERT INTO DemoTable617(FirstName) VALUES
('John'), ('Sam'), ('Carol'), ('Mike'), ('David'), ('Bob'), ('Robert'), ('Chris'), ('Mike'), ('Adam');
Truy vấn:
SELECT tbl.* FROM (
SELECT * FROM DemoTable617
ORDER BY FirstName DESC
LIMIT 5 OFFSET 2
) AS tbl
ORDER BY tbl.Id;
Kết quả:
+----+-----------+
| Id | FirstName |
+----+-----------+
| 1 | John |
| 4 | Mike |
| 5 | David |
| 8 | Chris |
| 9 | Mike |
+----+-----------+
Phân tích logic
ORDER BY FirstName DESC: Sắp xếp tên Z→A.OFFSET 2: Bỏ qua 2 dòng đầu (Sam, Robert).LIMIT 5: Lấy 5 dòng tiếp theo (Mike, Mike, John, David, Chris).- Outer query:
ORDER BY tbl.Idsắp xếp lại theo ID tăng dần để hiển thị.
Cách viết đơn giản hơn (nếu không cần sắp xếp lại)
SELECT * FROM DemoTable617
ORDER BY FirstName DESC
LIMIT 5 OFFSET 2;
Lưu ý về OFFSET
OFFSET 0= không bỏ qua (mặc định).LIMIT n OFFSET mtương đươngLIMIT m, n(cú pháp cũ).- Hiệu năng kém khi OFFSET lớn → dùng keyset pagination:
WHERE FirstName < 'last_seen_name' ORDER BY FirstName DESC LIMIT 5.
Ứng dụng: Lấy mẫu systematic sampling
Lấy 1 dòng mỗi 3 dòng (sample 1/3):
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY Id) AS rn
FROM DemoTable617
) t
WHERE rn % 3 = 1; -- MySQL 8.0+