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

Chọn dòng kế tiếp sau khi bỏ qua 2 dòng trong MySQL

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

  1. ORDER BY FirstName DESC: Sắp xếp tên Z→A.
  2. OFFSET 2: Bỏ qua 2 dòng đầu (Sam, Robert).
  3. LIMIT 5: Lấy 5 dòng tiếp theo (Mike, Mike, John, David, Chris).
  4. Outer query: ORDER BY tbl.Id sắ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 m tương đương LIMIT 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+