การข้ามแถวแรก N แถวใน MySQL ด้วย LIMIT ... OFFSET
ใช้ LIMIT offset, row_count หรือ LIMIT row_count OFFSET offset เพื่อข้ามแถวแรกและดึงแถวถัดไป
รูปแบบคำสั่ง
-- รูปแบบที่ 1 (MySQL พิเศษ)
SELECT * FROM table_name LIMIT offset, row_count;
-- รูปแบบที่ 2 (มาตรฐาน SQL)
SELECT * FROM table_name LIMIT row_count OFFSET offset;
ตัวอย่าง: ข้าม 3 แถวแรก แล้วดึงที่เหลือ
1. สร้างตารางและเพิ่มข้อมูล
CREATE TABLE DemoTable (Name VARCHAR(40));
INSERT INTO DemoTable VALUES ('Chris'), ('Robert'), ('Mike'), ('Bob'), ('David');
2. ดูข้อมูลทั้งหมด
SELECT * FROM DemoTable;
ผลลัพธ์:
+--------+
| Name |
+--------+
| Chris |
| Robert |
| Mike |
| Bob |
| David |
+--------+
3. ข้าม 3 แถวแรก (OFFSET 3) ดึงสูงสุด 100 แถว
SELECT * FROM DemoTable LIMIT 100 OFFSET 3;
หรือ
SELECT * FROM DemoTable LIMIT 3, 100;
ผลลัพธ์:
+-------+
| Name |
+-------+
| Bob |
| David |
+-------+
การทำงานของ OFFSET
OFFSET 0= ไม่ข้าม (เริ่มแถวแรก) - ค่าเริ่มต้นOFFSET 3= ข้าม 3 แถวแรก เริ่มจากแถวที่ 4LIMIT 100= ดึงสูงสุด 100 แถว (หากข้อมูลน้อยกว่า จะได้ตามจริง)
การใช้งานกับ Pagination (หน้าต่อหน้า)
-- หน้าที่ 1 (แถว 1-10)
SELECT * FROM DemoTable ORDER BY Id LIMIT 10 OFFSET 0;
-- หน้าที่ 2 (แถว 11-20)
SELECT * FROM DemoTable ORDER BY Id LIMIT 10 OFFSET 10;
-- หน้าที่ N
SELECT * FROM DemoTable ORDER BY Id LIMIT 10 OFFSET (N-1)*10;
ข้อควรระวังด้านประสิทธิภาพ
- OFFSET มาก = ช้า: MySQL ต้องอ่านและทิ้งแถวที่ข้ามไป (OFFSET 1,000,000 จะอ่าน 1 ล้านแถวก่อน)
- วิธีแก้ (Keyset Pagination / Seek Method):
-- แทน OFFSET ใช้ WHERE บนคอลัมน์ที่มี Index (เช่น Id)
SELECT * FROM DemoTable WHERE Id > 1000000 ORDER BY Id LIMIT 10;
วิธีนี้เร็วกว่ามากสำหรับหน้าสุดท้ายของข้อมูลเยอะ
MySQL 8.0+ : ใช้ OFFSET ... ROWS FETCH NEXT ... ROWS ONLY
SELECT * FROM DemoTable
ORDER BY Id
OFFSET 3 ROWS FETCH NEXT 100 ROWS ONLY;
เป็นมาตรฐาน SQL:2008 รองรับใน MySQL 8.0.22+