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

MySQL: เรียงวันที่และดึงแถวที่ 2 ด้วย LIMIT OFFSET

การเรียงลำดับวันที่และดึงแถวที่ 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 อ่านง่ายกว่า