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

ดึง 30 แถวล่าสุดใน MySQL ด้วย ORDER BY DESC LIMIT


สถานการณ์

ต้องการดึงข้อมูล 30 แถวที่เพิ่มเข้ามาล่าสุด (Latest 30 rows) จากตารางที่มี Auto Increment ID

วิธีแก้: ORDER BY ... DESC LIMIT 30

SELECT * FROM table_name ORDER BY id_column DESC LIMIT 30;

ตัวอย่างการใช้งาน

1. สร้างตารางพร้อม Auto Increment

mysql> CREATE TABLE DemoTable1567 (
    -> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
    -> );
Query OK, 0 rows affected (0.82 sec)

2. เพิ่มข้อมูล 37 แถว (Batch Insert)

mysql> INSERT INTO DemoTable1567 VALUES(),(),(),(),(),(),(),(),(),(),
    -> (),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),(),();
Query OK, 37 rows affected (0.37 sec)
Records: 37 Duplicates: 0 Warnings: 0

3. ดึง 30 แถวล่าสุด (Id สูงสุด 30 ค่า)

mysql> SELECT * FROM DemoTable1567 ORDER BY Id DESC LIMIT 30;

ผลลัพธ์ (Id 37 ถึง 8):

+----+
| Id |
+----+
| 37 |
| 36 |
| 35 |
| 34 |
| 33 |
| 32 |
| 31 |
| 30 |
| 29 |
| 28 |
| 27 |
| 26 |
| 25 |
| 24 |
| 23 |
| 22 |
| 21 |
| 20 |
| 19 |
| 18 |
| 17 |
| 16 |
| 15 |
| 14 |
| 13 |
| 12 |
| 11 |
| 10 |
| 9  |
| 8  |
+----+
30 rows in set (0.00 sec)

กรณีต้องการ 30 แถวล่าสุด แต่เรียง Ascending (เก่าไปใหม่)

ใช้ Subquery (Derived Table)

SELECT * FROM (
    SELECT * FROM DemoTable1567 ORDER BY Id DESC LIMIT 30
) AS t
ORDER BY Id ASC;

Performance Tips

  • Index บน Id (Primary Key มีอยู่แล้ว) → ใช้ Index Scan แบบ Backward ได้เร็วมาก
  • LIMIT 30 หยุดการ Scan ทันทีที่ครบ 30 แถว
  • หลีกเลี่ยง OFFSET มาก (เช่น LIMIT 1000000, 30) → ช้า

Pagination Pattern (Keyset Pagination)

-- หน้าแรก
SELECT * FROM DemoTable1567 ORDER BY Id DESC LIMIT 30;

-- หน้าต่อไป (ใช้ Id ของแถวสุดท้ายจากหน้าก่อน)
SELECT * FROM DemoTable1567 WHERE Id < 8 ORDER BY Id DESC LIMIT 30;

กรณีไม่มี Auto Increment (ใช้ Timestamp)

SELECT * FROM LogTable 
WHERE CreatedAt >= DATE_SUB(NOW(), INTERVAL 1 DAY)
ORDER BY CreatedAt DESC LIMIT 30;

กรณีการใช้งานจริง

  • Dashboard: แสดง 30 Activity/Log/Order ล่าสุด
  • Infinite Scroll: โหลดทีละ 30 รายการ
  • Admin Panel: ตรวจสอบ Recent Activity
  • API: /api/latest?limit=30