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

เรียงลำดับ 5 เรคคอร์ดล่าสุดตาม ID ใน MySQL ด้วย Subquery

เมื่อต้องการดึงข้อมูล 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  |
+------+

คำอธิบายขั้นตอน

  1. Inner Query: select * from DemoTable order by Id DESC limit 5 - ดึง 5 เรคคอร์ด ID มากที่สุด
  2. Outer Query: select * from (...) tbl order by Id - เรียงผลลัพธ์จากน้อยไปมาก
  3. 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 มาก เพราะจะช้า