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.