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

ข้าม 10 แถวแรกใน MySQL ด้วย LIMIT OFFSET

การแบ่งหน้า (Pagination) หรือการข้ามแถวแรกๆ ใน MySQL ใช้คำสั่ง LIMIT ร่วมกับ OFFSET

รูปแบบคำสั่ง

SELECT * FROM yourTableName LIMIT row_count OFFSET offset_value;

หรือรูปแบบสั้น:

SELECT * FROM yourTableName LIMIT offset_value, row_count;

ตัวอย่าง: ข้าม 10 แถวแรก แล้วเอา 10 แถวถัดไป

1. สร้างตารางและเพิ่มข้อมูล 15 แถว

mysql> CREATE TABLE SkipFirstTenRecords (
    -> StudentId INT,
    -> StudentName VARCHAR(200)
    -> );
Query OK, 0 rows affected (0.53 sec)

mysql> INSERT INTO SkipFirstTenRecords VALUES 
    -> (100, 'John'), (101, 'Johnson'), (102, 'Carol'), (103, 'Smith'),
    -> (104, 'Bob'), (105, 'David'), (106, 'Sam'), (107, 'Taylor'),
    -> (108, 'Ramit'), (109, 'Belly'), (110, 'Aaron'), (111, 'Peter'),
    -> (112, 'Travis'), (113, 'Alex'), (114, 'Pat');

2. ดูข้อมูลทั้งหมด

mysql> SELECT * FROM SkipFirstTenRecords;
+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
| 100       | John        |
| 101       | Johnson     |
| 102       | Carol       |
| 103       | Smith       |
| 104       | Bob         |
| 105       | David       |
| 106       | Sam         |
| 107       | Taylor      |
| 108       | Ramit       |
| 109       | Belly       |
| 110       | Aaron       |
| 111       | Peter       |
| 112       | Travis      |
| 113       | Alex        |
| 114       | Pat         |
+-----------+-------------+
15 rows in set (0.00 sec)

3. ข้าม 10 แถวแรก (OFFSET 10) แล้วเอา 10 แถว (LIMIT 10)

mysql> SELECT * FROM SkipFirstTenRecords LIMIT 10 OFFSET 10;

หรือ

mysql> SELECT * FROM SkipFirstTenRecords LIMIT 10, 10;
+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
| 110       | Aaron       |
| 111       | Peter       |
| 112       | Travis      |
| 113       | Alex        |
| 114       | Pat         |
+-----------+-------------+
5 rows in set (0.00 sec)

ได้แถวที่ 11-15 (รวม 5 แถว เพราะข้อมูลมีแค่ 15 แถว)

สูตรคำนวณสำหรับ Pagination

OFFSET = (page_number - 1) * page_size
LIMIT  = page_size

ตัวอย่าง: หน้าที่ 3, แสดงหน้าละ 10 รายการ

SELECT * FROM products LIMIT 10 OFFSET 20;  -- หรือ LIMIT 20, 10

ข้อควรระวังด้านประสิทธิภาพ

  • OFFSET ใหญ่ๆ จะช้า เพราะ MySQL ต้องอ่านและทิ้งแถวที่ข้ามไป
  • สำหรับ Deep Pagination (หน้าสุดท้ายของตารางใหญ่) ควรใช้ Keyset Pagination แทน:
-- แทน LIMIT 100000, 10
SELECT * FROM products WHERE id > 100000 ORDER BY id LIMIT 10;

ต้องมี Index บนคอลัมน์ที่ใช้เรียง (ปกติคือ Primary Key)