การแบ่งหน้า (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)