Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

วิธีข้าม N แถวแรกใน MySQL SELECT ด้วย OFFSET

การข้ามแถวแรก 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 แถวแรก เริ่มจากแถวที่ 4
  • LIMIT 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+