การเรียงลำดับวันที่และดึงแถวที่ N (Offset) ด้วย LIMIT
ใช้ ORDER BY เรียงวันที่ แล้ว LIMIT offset, count ดึงแถวที่ต้องการ (offset เริ่มที่ 0)
สร้างตารางและข้อมูล
mysql> create table DemoTable1417 (
-> CustomerId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> CustomerName varchar(20),
-> ShippingDate date
-> );
Query OK, 0 rows affected (1.10 sec)
mysql> insert into DemoTable1417(CustomerName, ShippingDate) values('Chris', '2019-01-21');
mysql> insert into DemoTable1417(CustomerName, ShippingDate) values('David', '2018-12-01');
mysql> insert into DemoTable1417(CustomerName, ShippingDate) values('Carol', '2019-09-28');
mysql> insert into DemoTable1417(CustomerName, ShippingDate) values('Sam', '2019-08-29');
ข้อมูลก่อนเรียง
+------------+--------------+--------------+ | CustomerId | CustomerName | ShippingDate | +------------+--------------+--------------+ | 1 | Chris | 2019-01-21 | | 2 | David | 2018-12-01 | | 3 | Carol | 2019-09-28 | | 4 | Sam | 2019-08-29 | +------------+--------------+--------------+
คำสั่ง ORDER BY CustomerId + LIMIT 2,1 (แถวที่ 3)
mysql> select CustomerName, ShippingDate
-> from DemoTable1417
-> order by CustomerId
-> limit 2, 1;
ผลลัพธ์ (แถวที่ 3: Carol)
+--------------+--------------+ | CustomerName | ShippingDate | +--------------+--------------+ | Carol | 2019-09-28 | +--------------+--------------+
ไวยากรณ์ LIMIT
LIMIT n— แถวแรก n แถว (offset = 0)LIMIT offset, n— ข้าม offset แถว แล้วเอา n แถวLIMIT n OFFSET offset— รูปแบบ ANSI SQL (MySQL รองรับ)
ตัวอย่าง Offset
LIMIT 0, 1 -- แถวที่ 1
LIMIT 1, 1 -- แถวที่ 2
LIMIT 2, 1 -- แถวที่ 3 (ตัวอย่างบทความ)
LIMIT 10, 5 -- แถวที่ 11-15 (pagination page 3, size 5)
การเรียงตามวันที่ (แทน CustomerId)
-- เรียงวันที่เก่าสุดก่อน แล้วเอาแถวที่ 2 SELECT CustomerName, ShippingDate FROM DemoTable1417 ORDER BY ShippingDate ASC LIMIT 1, 1; -- เรียงวันที่ใหม่สุดก่อน แล้วเอาแถวแรก (latest) SELECT CustomerName, ShippingDate FROM DemoTable1417 ORDER BY ShippingDate DESC LIMIT 1;
ประสิทธิภาพและ Index
- ต้องมี Index บนคอลัมน์ ORDER BY (CustomerId มี PK index แล้ว)
LIMIT offset, nต้องสแกน offset แถวก่อน — offset ใหญ่ = ช้า- Pagination ตารางใหญ่: ใช้ Keyset Pagination (WHERE id > last_seen_id ORDER BY id LIMIT n)
MySQL 8.0+: OFFSET ... FETCH
SELECT CustomerName, ShippingDate
FROM DemoTable1417
ORDER BY CustomerId
OFFSET 2 ROWS FETCH NEXT 1 ROW ONLY;
มาตรฐาน SQL:2008 อ่านง่ายกว่า