เมื่อต้องการลบ แถวสุดท้าย (Latest) ที่ตรงเงื่อนไขเฉพาะ ใช้ DELETE ร่วมกับ ORDER BY ... DESC LIMIT 1
รูปแบบคำสั่ง
DELETE FROM table_name
WHERE condition_column = value
ORDER BY sort_column DESC
LIMIT 1;
WHERE- กรองเงื่อนไข (เช่น UserId = 2)ORDER BY ... DESC- เรียงจากใหม่สุดไปเก่าสุดLIMIT 1- ลบแค่ 1 แถว (แถวแรกหลังเรียง = ล่าสุด)
ตัวอย่างการใช้งาน
1. สร้างตาราง Login History
CREATE TABLE UserLoginTable (
Id INT NOT NULL AUTO_INCREMENT,
UserId INT,
UserLoginDateTime DATETIME,
PRIMARY KEY (Id)
);
2. เพิ่มข้อมูล Login หลายครั้ง
INSERT INTO UserLoginTable (UserId, UserLoginDateTime) VALUES
(2, '2019-01-27 13:47:20'),
(1, '2018-11-28 12:30:12'),
(2, '2019-01-26 11:30:30'),
(1, '2015-03-11 15:23:55'),
(2, '2019-03-21 16:01:56');
ข้อมูลในตาราง:
+----+--------+---------------------+
| Id | UserId | UserLoginDateTime |
+----+--------+---------------------+
| 1 | 2 | 2019-01-27 13:47:20 |
| 2 | 1 | 2018-11-28 12:30:12 |
| 3 | 2 | 2019-01-26 11:30:30 |
| 4 | 1 | 2015-03-11 15:23:55 |
| 5 | 2 | 2019-03-21 16:01:56 | -- ล่าสุดของ UserId=2
+----+--------+---------------------+
3. ลบ Login ล่าสุดของ UserId = 2
DELETE FROM UserLoginTable
WHERE UserId = 2
ORDER BY UserLoginDateTime DESC
LIMIT 1;
ผลลัพธ์: Query OK, 1 row affected
4. ตรวจสอบข้อมูลที่เหลือ
SELECT * FROM UserLoginTable;
+----+--------+---------------------+
| Id | UserId | UserLoginDateTime |
+----+--------+---------------------+
| 1 | 2 | 2019-01-27 13:47:20 |
| 2 | 1 | 2018-11-28 12:30:12 |
| 3 | 2 | 2019-01-26 11:30:30 |
| 4 | 1 | 2015-03-11 15:23:55 |
+----+--------+---------------------+
แถว Id=5 (UserId=2, ล่าสุด) ถูกลบออก แถว Id=1,3 ของ UserId=2 ยังคงอยู่
กรณีศึกษาเพิ่มเติม
ลบแถวเก่าสุด (Oldest) ของ User
DELETE FROM UserLoginTable
WHERE UserId = 2
ORDER BY UserLoginDateTime ASC
LIMIT 1;
ลบ 3 รายการล่าสุด
DELETE FROM UserLoginTable
WHERE UserId = 2
ORDER BY UserLoginDateTime DESC
LIMIT 3;
ข้อจำกัดและข้อควรระวัง
- MySQL เท่านั้น: Syntax
DELETE ... ORDER BY ... LIMITเป็น MySQL-specific (ไม่ใช่ Standard SQL) - ไม่รองรับ JOIN: ไม่สามารถใช้ JOIN ใน DELETE แบบนี้ได้
- Race Condition: ในระบบ Multi-user อาจลบผิดแถว → ใช้ Transaction + SELECT ... FOR UPDATE
- Backup: ทดสอบด้วย SELECT ก่อน DELETE จริง
วิธีปลอดภัยกว่า (Standard SQL)
DELETE FROM UserLoginTable
WHERE Id = (
SELECT Id FROM (
SELECT Id FROM UserLoginTable
WHERE UserId = 2
ORDER BY UserLoginDateTime DESC
LIMIT 1
) AS sub
);
Subquery ทำให้เป็น Standard SQL และหลีกเลี่ยงปัญหาบางอย่างของ MySQL DELETE LIMIT