การเรียงลำดับวันที่ใน MySQL: ใช้ SELECT ... ORDER BY ไม่ใช่ UPDATE ... ORDER BY
MySQL ไม่รองรับ UPDATE ... ORDER BY (ต่างจากบาง DB) หากต้องการ "อัปเดตตามลำดับ" ต้องใช้เทคนิคอื่น แต่สำหรับการแสดงผลแค่เรียง ใช้ SELECT ... ORDER BY
สร้างตารางและข้อมูล
mysql> create table DemoTable1403 (
-> DueDate timestamp
-> );
Query OK, 0 rows affected (1.26 sec)
mysql> insert into DemoTable1403 values('2019-09-29');
mysql> insert into DemoTable1403 values('2016-02-21');
mysql> insert into DemoTable1403 values('2018-01-31');
mysql> insert into DemoTable1403 values('2017-12-01');
ข้อมูลก่อนเรียง
+---------------------+ | DueDate | +---------------------+ | 2019-09-29 00:00:00 | | 2016-02-21 00:00:00 | | 2018-01-31 00:00:00 | | 2017-12-01 00:00:00 | +---------------------+
คำสั่ง SELECT ORDER BY DESC
mysql> select * from DemoTable1403 order by DueDate DESC;
ผลลัพธ์ (ใหม่สุดก่อน)
+---------------------+ | DueDate | +---------------------+ | 2019-09-29 00:00:00 | | 2018-01-31 00:00:00 | | 2017-12-01 00:00:00 | | 2016-02-21 00:00:00 | +---------------------+
กรณีต้องการ UPDATE ตามลำดับ (จำเป็นต้องมีลำดับเฉพาะ)
MySQL ไม่รองรับ UPDATE ... ORDER BY แต่อาจจำเป็นต้องทำเมื่อ:
- อัปเดตคอลัมน์ที่มี Unique constraint (หลีกเลี่ยง duplicate key error ระหว่างอัปเดต)
- คำนวณค่าใหม่ขึ้นอยู่กับค่าก่อนหน้า (running total, sequence)
วิธีแก้: ใช้ Subquery / CTE / Temporary Table
-- 1. CTE (MySQL 8.0+) WITH ordered AS ( SELECT id, ROW_NUMBER() OVER (ORDER BY DueDate DESC) AS rn FROM DemoTable1403 ) UPDATE DemoTable1403 t JOIN ordered o ON t.id = o.id SET t.some_col = o.rn; -- 2. Subquery ใน UPDATE UPDATE DemoTable1403 t JOIN ( SELECT id, ROW_NUMBER() OVER (ORDER BY DueDate DESC) AS rn FROM DemoTable1403 ) o ON t.id = o.id SET t.some_col = o.rn;
ORDER BY ใน SELECT: ตัวเลือกเพิ่มเติม
ORDER BY DueDate ASC— เก่าสุดก่อน (default)ORDER BY DueDate DESC— ใหม่สุดก่อนORDER BY DueDate DESC, Id ASC— เรียงวันที่ใหม่ก่อน, ID เดียวกัน เรียง ID น้อยก่อนORDER BY RAND()— สุ่ม (ช้า บนตารางใหญ่)
สรุป: การ "อัปเดตและเรียง" ไม่ได้ใน MySQL — ใช้ SELECT ORDER BY สำหรับแสดงผล, ใช้ CTE/Subquery สำหรับ UPDATE ที่ต้องการลำดับ