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

เลือกแถวแรกและแถวสุดท้ายด้วย LIMIT ใน MySQL

ใช้ UNION รวมผลลัพธ์ของ LIMIT 1 (แถวแรก) และ LIMIT offset, 1 (แถวสุดท้าย)

ตัวอย่าง

1. สร้างตารางและข้อมูล 9 แถว

mysql> create table FirstAndLastDataDemo (
    -> EmployeeId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> EmployeeName varchar(20),
    -> EmployeeAge int
    -> );

mysql> insert into FirstAndLastDataDemo(EmployeeName,EmployeeAge) values
    -> ('John',23),('Bob',13),('Larry',24),('Sam',14),('Mike',31),
    -> ('James',18),('Maxwell',28),('David',27),('Chris',22);

2. Query แถวแรกและสุดท้าย

mysql> (SELECT * FROM FirstAndLastDataDemo LIMIT 1)
    -> UNION
    -> (SELECT * FROM FirstAndLastDataDemo LIMIT 8, 1);

3. ผลลัพธ์

+------------+--------------+-------------+
| EmployeeId | EmployeeName | EmployeeAge |
+------------+--------------+-------------+
| 1          | John         | 23          |
| 9          | Chris        | 22          |
+------------+--------------+-------------+

วิธีอื่น: ใช้ Subquery หา ID สุดท้าย

SELECT * FROM FirstAndLastDataDemo 
WHERE EmployeeId = (SELECT MIN(EmployeeId) FROM FirstAndLastDataDemo)
   OR EmployeeId = (SELECT MAX(EmployeeId) FROM FirstAndLastDataDemo);

MySQL 8.0+ ใช้ Window Functions

WITH ranked AS (
    SELECT *, 
           ROW_NUMBER() OVER (ORDER BY EmployeeId) as rn_asc,
           ROW_NUMBER() OVER (ORDER BY EmployeeId DESC) as rn_desc
    FROM FirstAndLastDataDemo
)
SELECT EmployeeId, EmployeeName, EmployeeAge
FROM ranked
WHERE rn_asc = 1 OR rn_desc = 1
ORDER BY EmployeeId;

กรณีตารางว่าง

UNION จะคืนค่าว่าง (ไม่ Error) - เหมาะกับแอปพลิเคชันที่ต้องจัดการ empty result

ประสิทธิภาพ

  • LIMIT 1 เร็วมาก (หยุดอ่านทันที)
  • LIMIT offset, 1 ต้องสแกน offset แถว - ช้าเมื่อ offset ใหญ่
  • วิธี MIN/MAX ใช้ Index ได้ - เร็วที่สุดสำหรับตารางใหญ่