สถานการณ์
ต้องการดึงข้อมูล 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