การเรียงข้อมูลตามความยาวสตริง (Character Length)
ใช้ ORDER BY LENGTH(column) เพื่อเรียงลำดับตามจำนวนตัวอักษร สามารถรวมกับการเรียงตัวอักษรอีกชั้นได้
ตัวอย่างการใช้งาน
สร้างตารางและเพิ่มสตริงความยาวต่างกัน:
mysql> CREATE TABLE orderingAADemo (
-> Value VARCHAR(100)
-> );
Query OK, 0 rows affected (1.30 sec)
mysql> INSERT INTO orderingAADemo VALUES('A'),('B'),('AA'),('C'),('CCC');
Query OK, 5 rows affected (0.18 sec)
ข้อมูลก่อนเรียง:
mysql> SELECT * FROM orderingAADemo;
+-------+
| Value |
+-------+
| A |
| B |
| AA |
| C |
| CCC |
+-------+
5 rows in set (0.00 sec)
เรียงตามความยาว DESC (ยาวสุดก่อน) แล้วตามตัวอักษร ASC:
mysql> SELECT * FROM orderingAADemo
-> ORDER BY LENGTH(Value) DESC, Value;
+-------+
| Value |
+-------+
| CCC |
| AA |
| A |
| B |
| C |
+-------+
5 rows in set (0.00 sec)
คำอธิบาย
LENGTH(Value)คืนค่าจำนวน Byte (สำหรับ UTF-8 ตัวอักษรไทย 1 ตัว = 3 Bytes) หากต้องการนับตัวอักษรจริง ใช้CHAR_LENGTH(Value)หรือCHARACTER_LENGTH(Value)DESCเรียงมากไปน้อย (ยาวสุดก่อน), Valueเป็น Tie-breaker: ความยาวเท่ากัน เรียงตามตัวอักษร
ตัวอย่างเพิ่มเติม
-- เรียงสั้นสุดก่อน (ASC)
ORDER BY CHAR_LENGTH(name), name
-- เรียงชื่อที่มีความยาวเท่ากันแบบ Random
ORDER BY CHAR_LENGTH(name), RAND()
-- หา 5 ชื่อที่ยาวที่สุด
SELECT name FROM users ORDER BY CHAR_LENGTH(name) DESC LIMIT 5;
ข้อควรระวังประสิทธิภาพ
ORDER BY LENGTH(col) ไม่ใช้ Index ได้ (ต้องคำนวณทุกแถว) หากตารางใหญ่ ควรเพิ่ม Generated Column เก็บความยาวไว้:
ALTER TABLE t ADD COLUMN name_len INT GENERATED ALWAYS AS (CHAR_LENGTH(name)) STORED;
CREATE INDEX idx_name_len ON t(name_len);
-- แล้ว ORDER BY name_len DESC, name