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

MySQL ORDER BY ค่าที่ปรับแต่งเองด้วย FIND_IN_SET

บทความนี้สาธิตการจัดลำดับข้อมูลตามลำดับที่กำหนดเอง (Custom Order) โดยใช้ FIND_IN_SET() เพื่อกำหนดลำดับความสำคัญของค่าต่างๆ ในคอลัมน์

สร้างตารางและข้อมูลสถานะผู้ใช้

mysql> CREATE TABLE DemoTable677(
    UserId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    UserStatus TEXT
);
Query OK, 0 rows affected (1.07 sec)

mysql> INSERT INTO DemoTable677(UserStatus) VALUES('BUSY');
mysql> INSERT INTO DemoTable677(UserStatus) VALUES('AT WORK');
mysql> INSERT INTO DemoTable677(UserStatus) VALUES('OFFLINE');
mysql> INSERT INTO DemoTable677(UserStatus) VALUES('BLOCKED');

คิวรี ORDER BY ด้วย FIND_IN_SET

mysql> SELECT * FROM DemoTable677 
ORDER BY FIND_IN_SET(UserStatus, 'BLOCKED,AT WORK,OFFLINE,BUSY');

ผลลัพธ์ (เรียงตามลำดับที่กำหนด: BLOCKED → AT WORK → OFFLINE → BUSY)

+--------+------------+
| UserId | UserStatus |
+--------+------------+
| 4      | BLOCKED    |
| 2      | AT WORK    |
| 3      | OFFLINE    |
| 1      | BUSY       |
+--------+------------+

คำอธิบาย:

  • FIND_IN_SET(str, strlist) - คืนตำแหน่ง (1-based) ของ str ใน strlist (คั่นด้วยจุลภาค)
  • ค่าที่ไม่อยู่ในลิสต์ จะได้ 0 → จะถูกจัดไปก่อนสุด (หาก ASC) หรือท้ายสุด (หาก DESC)
  • ในตัวอย่าง: BLOCKED=1, AT WORK=2, OFFLINE=3, BUSY=4 → เรียง 1,2,3,4

เทคนิคอื่น: ใช้ CASE WHEN UserStatus='BLOCKED' THEN 1 WHEN UserStatus='AT WORK' THEN 2 ... END ซึ่งยืดหยุ่นกว่าและรองรับค่าที่มีจุลภาคในตัวได้