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

ดึงแถวที่ N (Nth Record) ใน MySQL ใช้ LIMIT OFFSET


ไวยากรณ์ LIMIT OFFSET

ใช้ LIMIT offset, count เพื่อข้ามแถวแรกๆ และ取得แถวที่ต้องการ:

SELECT * FROM your_table
ORDER BY sort_column
LIMIT n-1, 1;  -- ดึงแถวที่ n (0-based offset)

ตัวอย่างการใช้งาน

สร้างตารางและข้อมูล 7 แถว

CREATE TABLE NthRecordDemo (Id INT, Name VARCHAR(200));
INSERT INTO NthRecordDemo VALUES
(100, 'John'), (101, 'Bob'), (102, 'Carol'), (103, 'Smith'),
(104, 'Johnson'), (105, 'Sam'), (106, 'David');

ข้อมูลทั้งหมด (เรียงตาม Id)

+------+---------+
| Id   | Name    |
+------+---------+
| 100  | John    |
| 101  | Bob     |
| 102  | Carol   |
| 103  | Smith   |
| 104  | Johnson |
| 105  | Sam     |
| 106  | David   |
+------+---------+

ดึงแถวที่ 7 (N=7, Offset=6)

SELECT * FROM NthRecordDemo ORDER BY Id LIMIT 6, 1;

ผลลัพธ์

+------+-------+
| Id   | Name  |
+------+-------+
| 106  | David |
+------+-------+

รูปแบบ LIMIT ต่างๆ

Syntax ความหมาย
LIMIT 5 5 แถวแรก (Offset 0, Count 5)
LIMIT 0, 5 5 แถวแรก (Offset 0, Count 5)
LIMIT 5, 10 ข้าม 5 แถว แล้ว取得 10 แถว (หน้าที่ 2 หน้าละ 10)
LIMIT 10 OFFSET 5 รูปแบบ ANSI SQL (MySQL รองรับ)

ใช้งานการ Pagination (แบ่งหน้า)

-- หน้าที่ 1 (หน้าละ 10)
SELECT * FROM products ORDER BY id LIMIT 0, 10;

-- หน้าที่ 2
SELECT * FROM products ORDER BY id LIMIT 10, 10;

-- หน้าที่ N
SELECT * FROM products ORDER BY id LIMIT (page-1)*page_size, page_size;

ประสิทธิภาพกับ OFFSET ใหญ่

ปัญหา: LIMIT 1000000, 10 ต้อง Scan 1 ล้านแถวก่อน → ช้า

วิธีแก้: Seek Pagination (Keyset Pagination)

-- หน้าแรก
SELECT * FROM products WHERE id > 0 ORDER BY id LIMIT 10;

-- หน้าต่อไป (ใช้ ID สุดท้ายของหน้าก่อน)
SELECT * FROM products WHERE id > 1000000 ORDER BY id LIMIT 10;

เร็วกว่ามาก ใช้ Index ได้เต็มที่

MySQL 8.0+: ใช้ ROW_NUMBER() (Window Function)

WITH numbered AS (
    SELECT *, ROW_NUMBER() OVER (ORDER BY Id) AS rn
    FROM NthRecordDemo
)
SELECT * FROM numbered WHERE rn = 7;