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

MySQL: ลบแถวสุดท้ายตามเงื่อนไขด้วย ORDER BY DESC LIMIT 1

เมื่อต้องการลบ แถวสุดท้าย (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