Khi cột lưu chuỗi dạng 'STUDENT78', 'STUDENT98' và bạn muốn tìm giá trị **lớn nhất theo phần số đuôi**, không thể dùng ORDER BY StudentCode DESC trực tiếp (sắp xếp theo chữ cái). Cần tách phần số và ép kiểu sang số để sắp xếp.
Kỹ thuật
- Lọc hàng có tiền tố mong muốn:
WHERE StudentCode LIKE 'STUDENT%' - Tách phần số:
RIGHT(StudentCode, LENGTH(StudentCode) - LENGTH('STUDENT')) - Ép kiểu sang số:
CAST(... AS UNSIGNED) - Sắp xếp giảm dần và lấy 1:
ORDER BY ... DESC LIMIT 1
Ví dụ minh họa
mysql> CREATE TABLE DemoTable1487 (StudentCode TEXT);
mysql> INSERT INTO DemoTable1487 VALUES
-> ('560'), ('789'), ('STUDENT78'), ('John89'), ('Carol101'), ('STUDENT98');
Truy vấn lấy mã STUDENT có số đuôi lớn nhất:
mysql> SELECT * FROM DemoTable1487
-> WHERE StudentCode LIKE 'STUDENT%'
-> ORDER BY CAST(RIGHT(StudentCode, LENGTH(StudentCode) - LENGTH('STUDENT')) AS UNSIGNED) DESC
-> LIMIT 1;
Kết quả:
+-------------+ | StudentCode | +-------------+ | STUDENT98 | +-------------+
Giải thích hàm dùng
LENGTH('STUDENT')= 7LENGTH('STUDENT98')= 9 →RIGHT(..., 2)= '98'CAST('98' AS UNSIGNED)= 98 (số)
Cách hiện đại hơn (MySQL 8.0+)
Dùng REGEXP_SUBSTR hoặc SUBSTRING_INDEX nếu phân tách bằng ký tự cố định. Ví dụ với dấu gạch dưới:
SELECT * FROM bang WHERE cot LIKE 'STUDENT_%' ORDER BY CAST(SUBSTRING_INDEX(cot, '_', -1) AS UNSIGNED) DESC LIMIT 1;
⚠️ Hiệu năng
Biểu thức trong ORDER BY không dùng được index thông thường. Với bảng lớn, hãy:
- Tách phần số vào cột riêng (generated column) + index.
- Hoặc lưu phần số riêng cột
student_number INT.