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

MySQL: เรียงลำดับคอลัมน์ alphanumeric ที่มีความยาวต่างกัน

การจัดเรียง (Sorting) ข้อมูล alphanumeric ที่มีตัวเลขความยาวไม่เท่ากัน

เมื่อเรียงลำดับสตริงแบบ alphanumeric เช่น STU-MIT-10, STU-MIT-143 การเรียงแบบสตริงปกติ (lexicographic) จะได้ลำดับผิด เพราะ "10" จะอยู่ก่อน "143" แต่ "2" จะอยู่หลัง "143" บทความนี้แสดงวิธีแยกส่วนตัวเลขและแปลงเป็นตัวเลขจริงเพื่อเรียงให้ถูกต้อง

สร้างตารางและข้อมูล

mysql> create table DemoTable1623 (
    -> StudentCode varchar(20)
    -> );
Query OK, 0 rows affected (0.47 sec)

mysql> insert into DemoTable1623 values('STU-MIT-143');
mysql> insert into DemoTable1623 values('STU-MIT-10');
mysql> insert into DemoTable1623 values('STU-MIT-150');
mysql> insert into DemoTable1623 values('STU-MIT-148');

ข้อมูลก่อนเรียง

+-------------+
| StudentCode |
+-------------+
| STU-MIT-143 |
| STU-MIT-10  |
| STU-MIT-150 |
| STU-MIT-148 |
+-------------+

คำสั่ง ORDER BY ที่ถูกต้อง

mysql> select * from DemoTable1623
    -> order by substring_index(StudentCode, '-', 1),
    -> substring_index(StudentCode, '-', -1) + 0;

ผลลัพธ์หลังเรียงถูกต้อง

+-------------+
| StudentCode |
+-------------+
| STU-MIT-10  |
| STU-MIT-143 |
| STU-MIT-148 |
| STU-MIT-150 |
+-------------+

อธิบายการทำงาน

  • substring_index(StudentCode, '-', 1) — ดึงส่วนก่อนเครื่องหมาย - ตัวแรก (คือ STU) ใช้จัดกลุ่มหลัก
  • substring_index(StudentCode, '-', -1) — ดึงส่วนหลังเครื่องหมาย - ตัวสุดท้าย (คือตัวเลข 10, 143, ...)
  • + 0 — แปลงสตริงตัวเลขให้เป็นตัวเลขจริง (numeric context) เพื่อให้เรียงเป็นตัวเลข ไม่ใช่สตริง

ขยายใช้งาน: รูปแบบซับซ้อนกว่า

หากรูปแบบเป็น ABC-123-XYZ-45 และต้องการเรียงตามตัวเลขสุดท้าย:

ORDER BY 
  SUBSTRING_INDEX(StudentCode, '-', 1),  -- ABC
  SUBSTRING_INDEX(SUBSTRING_INDEX(StudentCode, '-', 2), '-', -1) + 0,  -- 123
  SUBSTRING_INDEX(StudentCode, '-', -1) + 0  -- 45

เคล็ดลับ: ใน MySQL 8.0+ สามารถใช้ CAST(... AS UNSIGNED) แทน + 0 เพื่อความชัดเจนมากขึ้น