ไวยากรณ์ LIMIT OFFSET
ใช้ LIMIT offset, count เพื่อข้ามแถวแรกๆ และ取得แถวที่ต้องการ:
SELECT * FROM your_table
ORDER BY sort_column
LIMIT n-1, 1; -- ดึงแถวที่ n (0-based offset)
ตัวอย่างการใช้งาน
สร้างตารางและข้อมูล 7 แถว
CREATE TABLE NthRecordDemo (Id INT, Name VARCHAR(200));
INSERT INTO NthRecordDemo VALUES
(100, 'John'), (101, 'Bob'), (102, 'Carol'), (103, 'Smith'),
(104, 'Johnson'), (105, 'Sam'), (106, 'David');
ข้อมูลทั้งหมด (เรียงตาม Id)
+------+---------+
| Id | Name |
+------+---------+
| 100 | John |
| 101 | Bob |
| 102 | Carol |
| 103 | Smith |
| 104 | Johnson |
| 105 | Sam |
| 106 | David |
+------+---------+
ดึงแถวที่ 7 (N=7, Offset=6)
SELECT * FROM NthRecordDemo ORDER BY Id LIMIT 6, 1;
ผลลัพธ์
+------+-------+
| Id | Name |
+------+-------+
| 106 | David |
+------+-------+
รูปแบบ LIMIT ต่างๆ
| Syntax | ความหมาย |
|---|---|
| LIMIT 5 | 5 แถวแรก (Offset 0, Count 5) |
| LIMIT 0, 5 | 5 แถวแรก (Offset 0, Count 5) |
| LIMIT 5, 10 | ข้าม 5 แถว แล้ว取得 10 แถว (หน้าที่ 2 หน้าละ 10) |
| LIMIT 10 OFFSET 5 | รูปแบบ ANSI SQL (MySQL รองรับ) |
ใช้งานการ Pagination (แบ่งหน้า)
-- หน้าที่ 1 (หน้าละ 10)
SELECT * FROM products ORDER BY id LIMIT 0, 10;
-- หน้าที่ 2
SELECT * FROM products ORDER BY id LIMIT 10, 10;
-- หน้าที่ N
SELECT * FROM products ORDER BY id LIMIT (page-1)*page_size, page_size;
ประสิทธิภาพกับ OFFSET ใหญ่
ปัญหา: LIMIT 1000000, 10 ต้อง Scan 1 ล้านแถวก่อน → ช้า
วิธีแก้: Seek Pagination (Keyset Pagination)
-- หน้าแรก
SELECT * FROM products WHERE id > 0 ORDER BY id LIMIT 10;
-- หน้าต่อไป (ใช้ ID สุดท้ายของหน้าก่อน)
SELECT * FROM products WHERE id > 1000000 ORDER BY id LIMIT 10;
เร็วกว่ามาก ใช้ Index ได้เต็มที่
MySQL 8.0+: ใช้ ROW_NUMBER() (Window Function)
WITH numbered AS (
SELECT *, ROW_NUMBER() OVER (ORDER BY Id) AS rn
FROM NthRecordDemo
)
SELECT * FROM numbered WHERE rn = 7;