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

MySQL: เรียงลำดับวันที่ด้วย ORDER BY (ไม่สามารถ UPDATE ... ORDER BY ได้)

การเรียงลำดับวันที่ใน 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 ที่ต้องการลำดับ