ใช้ 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 ได้ - เร็วที่สุดสำหรับตารางใหญ่