เมื่อต้องการดึงข้อมูล 5 เรคคอร์ดล่าสุด (ตาม ID มากที่สุด) แต่ต้องการแสดงผลในลำดับจากน้อยไปมาก (ASC) ต้องใช้ Subquery เพื่อกรองก่อน แล้วค่อยเรียงลำดับใหม่
สร้างตารางและข้อมูล
mysql> create table DemoTable (Id int);
mysql> insert into DemoTable values(100),(115),(200),(140),(124),(198),(156),(178),(156);
คำสั่ง Subquery
mysql> select * from (
select * from DemoTable order by Id DESC limit 5
) tbl order by Id;
ผลลัพธ์
+------+ | Id | +------+ | 156 | | 156 | | 178 | | 198 | | 200 | +------+
คำอธิบายขั้นตอน
- Inner Query:
select * from DemoTable order by Id DESC limit 5- ดึง 5 เรคคอร์ด ID มากที่สุด - Outer Query:
select * from (...) tbl order by Id- เรียงผลลัพธ์จากน้อยไปมาก - Alias (tbl) - จำเป็นต้องตั้งชื่อ alias ให้ subquery
วิธีทางเลือกอื่น
ใช้ CTE (MySQL 8.0+)
WITH latest_five AS (
SELECT * FROM DemoTable ORDER BY Id DESC LIMIT 5
)
SELECT * FROM latest_five ORDER BY Id;
ใช้ Variable (เก่า)
SET @row_num = 0;
SELECT Id FROM (
SELECT Id, @row_num := @row_num + 1 as rn
FROM DemoTable ORDER BY Id DESC
) t WHERE rn <= 5 ORDER BY Id;
ประสิทธิภาพ
- Subquery/CTE ใช้ Index ได้ หากมี Index บนคอลัมน์ Id
- LIMIT ใน Inner Query ช่วยลดข้อมูลที่ต้องประมวลผล
- หลีกเลี่ยงการใช้ OFFSET มาก เพราะจะช้า