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

MySQL LIMIT ในช่วง (Range): แสดง 3 แถวแรกด้วย LIMIT 0,3

ไวยากรณ์ LIMIT

SELECT * FROM yourTable
LIMIT offset, row_count;

  • offset: จำนวนแถวที่ข้าม (เริ่มจาก 0)
  • row_count: จำนวนแถวที่ต้องการ

ตัวอย่าง: ตาราง demo67

CREATE TABLE demo67 (
    id INT,
    user_name VARCHAR(40),
    user_country_name VARCHAR(20)
);

INSERT INTO demo67 VALUES
(10, 'John', 'US'), (1001, 'David', 'AUS'), (101, 'Mike', 'UK'),
(102, 'Carol', 'AUS'), (110, 'Chris', 'US'), (105, 'David', 'AUS');

ข้อมูลทั้งหมด (6 แถว)

+------+-----------+-------------------+
| id   | user_name | user_country_name |
+------+-----------+-------------------+
| 10   | John      | US                |
| 1001 | David     | AUS               |
| 101  | Mike      | UK                |
| 102  | Carol     | AUS               |
| 110  | Chris     | US                |
| 105  | David     | AUS               |
+------+-----------+-------------------+

คำสั่ง: แสดง 3 แถวแรก (Offset 0, Limit 3)

SELECT * FROM demo67 LIMIT 0, 3;

ผลลัพธ์

+------+-----------+-------------------+
| id   | user_name | user_country_name |
+------+-----------+-------------------+
| 10   | John      | US                |
| 1001 | David     | AUS               |
| 101  | Mike      | UK                |
+------+-----------+-------------------+

รูปแบบอื่น: LIMIT row_count OFFSET offset

SELECT * FROM demo67 LIMIT 3 OFFSET 0;

มาตรฐาน SQL:2008 — อ่านง่ายกว่า

Pagination Pattern

Page 1: LIMIT 0, 10   (OFFSET 0)
Page 2: LIMIT 10, 10  (OFFSET 10)
Page 3: LIMIT 20, 10  (OFFSET 20)
...
Page N: LIMIT (N-1)*10, 10

⚠️ ปัญหา LIMIT OFFSET ใหญ่ (Deep Pagination)

MySQL ต้องอ่าน/ข้ามแถวทั้งหมดก่อน Offset → ช้ามากเมื่อ Offset ใหญ่

แก้ไข: Keyset Pagination (Seek Method)

-- หน้าแรก
SELECT * FROM demo67 ORDER BY id LIMIT 10;

-- หน้าถัดไป (ใช้ id สุดท้ายของหน้าก่อน = 101)
SELECT * FROM demo67 WHERE id > 101 ORDER BY id LIMIT 10;
  • ใช้ INDEX บน id ได้เต็มที่
  • เร็วคงที่ ไม่ขึ้นกับ Page Number
  • ต้องมี Unique Sort Key (PK หรือ Unique Index)

MySQL 8.0: OFFSET ... FETCH

SELECT * FROM demo67
ORDER BY id
OFFSET 0 ROWS FETCH NEXT 3 ROWS ONLY;

สรุป

สถานการณ์แนะนำ
ข้อมูลน้อย < 10k, Paging ธรรมดาLIMIT offset, count
ข้อมูลเยอะ, Deep PagingKeyset Pagination (WHERE id > last_id)
Infinite ScrollKeyset Pagination
Jump to Page NLIMIT (ต้องยอมรับช้า)