สถานการณ์
ต้องการจัดเรียงตัวเลขโดย: ค่ามากกว่า 10 เรียงจากน้อยไปมาก (ASC) แล้วค่าต่ำกว่าหรือเท่ากับ 10 เรียงจากมากไปน้อย (DESC) - เรียกว่า "Wrap Around"
วิธีแก้: ใช้ Boolean Expression ใน ORDER BY
ORDER BY Value > 10 DESC, Value ASC
Value > 10คืนค่า 1 (True) หรือ 0 (False)DESCทำให้ True (1) อยู่บน, False (0) อยู่ล่าง- ในกลุ่ม True → เรียง Value ASC
- ในกลุ่ม False → เรียง Value ASC (แต่กลุ่มนี้อยู่ล่าง)
ตัวอย่างการใช้งาน
1. สร้างตาราง
mysql> CREATE TABLE DemoTable (
-> Value INT
-> );
Query OK, 0 rows affected (3.21 sec)
2. เพิ่มข้อมูล
mysql> INSERT INTO DemoTable VALUES(20), (40), (30), (10), (90), (70), (80), (9), (8); Query OK, 9 rows affected (...)
3. แสดงข้อมูลต้นฉบับ
mysql> SELECT * FROM DemoTable;
ผลลัพธ์:
+-------+ | Value | +-------+ | 20 | | 40 | | 30 | | 10 | | 90 | | 70 | | 80 | | 9 | | 8 | +-------+ 9 rows in set (0.00 sec)
4. Wrap-around Sort
mysql> SELECT * FROM DemoTable ORDER BY Value > 10 DESC, Value ASC;
ผลลัพธ์:
+-------+ | Value | +-------+ | 20 | | 30 | | 40 | | 70 | | 80 | | 90 | | 8 | | 9 | | 10 | +-------+ 9 rows in set (0.00 sec)
อธิบาย Logic
| Value | Value > 10 | Group Order (DESC) | Value ASC ในกลุ่ม |
|---|---|---|---|
| 20,30,40,70,80,90 | 1 (True) | 1st Group (บน) | 20,30,40,70,80,90 |
| 8,9,10 | 0 (False) | 2nd Group (ล่าง) | 8,9,10 |
การประยุกต์ใช้ (Generalized)
-- วงจร: 1-100, เริ่มที่ 50
ORDER BY Value >= 50 DESC, Value ASC;
-- หลายช่วง: 1-10 (ล่าง), 11-20 (กลาง), 21+ (บน)
ORDER BY
CASE
WHEN Value >= 21 THEN 3
WHEN Value >= 11 THEN 2
ELSE 1
END DESC,
Value ASC;
กรณีการใช้งานจริง
- Circular Buffer / Round Robin: เริ่มจาก Pointer แล้ววนรอบ
- Priority Queue: High Priority ก่อน, แล้ว Low Priority เรียงย้อน
- Game Leaderboard: Current Season Top, แล้ว Previous Season
- Notification: Unread ก่อน (Newest First), แล้ว Read (Oldest First)
ข้อควรระวัง
- Boolean Expression ใน ORDER BY ไม่ใช้ Index ได้ (Filesort)
- ข้อมูลเยอะ ควรเพิ่ม WHERE จำกัดขอบเขตก่อน
- MySQL 8.0+ ใช้ Window Function ควบคุมได้ละเอียดกว่า