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

MySQL: เรียงลำดับตามความยาวตัวอักษรด้วย ORDER BY LENGTH()

การเรียงข้อมูลตามความยาวสตริง (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