Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Sắp xếp chuỗi alphanumeric theo phần số ở cuối trong MySQL

Vấn đề: ORDER BY phần số cuối của chuỗi (ví dụ: 'Adam_101', 'Bob_563')

Cột StudentCode chứa chuỗi dạng 'Tên_Số'. Cần sắp xếp theo phần số (101, 563...).

Giải pháp: ORDER BY RIGHT(StudentCode, 3)

Giả sử phần số luôn có 3 chữ số ở cuối. RIGHT(str, len) lấy len ký tự cuối.

1. Tạo bảng và dữ liệu

CREATE TABLE DemoTable (StudentCode VARCHAR(20));
INSERT INTO DemoTable VALUES
('121John_567'), ('Adam_101'), ('Bob_563'), ('Sam_346');

2. Dữ liệu gốc

+-------------+
| StudentCode |
+-------------+
| 121John_567 |
| Adam_101    |
| Bob_563     |
| Sam_346     |
+-------------+

3. Truy vấn sắp xếp

SELECT * FROM DemoTable 
ORDER BY RIGHT(StudentCode, 3);

4. Kết quả (theo 101, 346, 563, 567)

+-------------+
| StudentCode |
+-------------+
| Adam_101    |
| Sam_346     |
| Bob_563     |
| 121John_567 |
+-------------+

Hạn chế của cách này

  • Chỉ đúng nếu phần số có độ dài cố định (ví dụ luôn 3 chữ số).
  • Nếu độ dài khác nhau ('A_1', 'B_12', 'C_123'), RIGHT(..., 3) sẽ lấy sai ('A_1' → 'A_1', 'B_12' → 'B_12', 'C_123' → '123').

Cách tổng quát hơn (MySQL 8.0+): REGEXP_SUBSTR hoặc SUBSTRING_INDEX

-- Lấy phần sau dấu '_' cuối cùng
ORDER BY CAST(SUBSTRING_INDEX(StudentCode, '_', -1) AS UNSIGNED);

SUBSTRING_INDEX(str, delim, -1) lấy phần sau delimiter cuối. CAST(... AS UNSIGNED) chuyển thành số để sắp xếp số học (1, 2, 10, 100) thay vì chữ (1, 10, 100, 2).

Lưu ý hiệu suất

  • Hàm trên cột trong ORDER BY làm mất chỉ mục.
  • Nếu thường xuyên sắp xếp theo phần số, cân nhắc tách cột số riêng hoặc generated column.