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

จัดเรียงแบบ Wrap-around: ค่ามากกว่า 10 เรียงน้อยไปมาก ค่าน้อยกว่า 10 เรียงมากไปน้อย ใน MySQL


สถานการณ์

ต้องการจัดเรียงตัวเลขโดย: ค่ามากกว่า 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 ควบคุมได้ละเอียดกว่า