Khi cột chứa tiền tố chuỗi cố định (ví dụ: INV) theo sau là số, dùng SUBSTRING tách phần số rồi CAST ... AS UNSIGNED để so sánh số học.
Cú pháp
SELECT MAX(CAST(SUBSTRING(ten_cot, vi_tri_bat_dau, do_dai) AS UNSIGNED)) AS GiaTriLonNhat FROM ten_bang;
Ví dụ minh họa
Tạo bảng hóa đơn (InvoiceNumber = 'INV' + số):
mysql> CREATE TABLE SoHoaDonChuSo (
-> MaHoaDon INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> SoHoaDon VARCHAR(20)
-> );
Chèn dữ liệu (số không theo thứ tự):
mysql> INSERT INTO SoHoaDonChuSo(SoHoaDon) VALUES
-> ('INV129'), ('INV122'), ('INV1'), ('INV145'), ('INV19'),
-> ('INV134'), ('INV135'), ('INV10'), ('INV100'), ('INV121');
Dữ liệu:
+-----------+------------+ | MaHoaDon | SoHoaDon | +-----------+------------+ | 1 | INV129 | | 2 | INV122 | | 3 | INV1 | | 4 | INV145 | | 5 | INV19 | | 6 | INV134 | | 7 | INV135 | | 8 | INV10 | | 9 | INV100 | | 10 | INV121 | +-----------+------------+
Tìm số hóa đơn lớn nhất (bỏ tiền tố 'INV' = 3 ký tự)
mysql> SELECT MAX(CAST(SUBSTRING(SoHoaDon, 4, LENGTH(SoHoaDon) - 3) AS UNSIGNED)) AS SoLonNhat
-> FROM SoHoaDonChuSo;
Kết quả:
+-----------+ | SoLonNhat | +-----------+ | 145 | +-----------+
Giải thích:
SUBSTRING(SoHoaDon, 4, ...): Bắt đầu từ ký tự thứ 4 (sau 'INV')LENGTH(SoHoaDon) - 3: Độ dài phần số (tổng - 3 ký tự 'INV')CAST(... AS UNSIGNED): Chuyển chuỗi số sang số để so sánh đúng (145 > 19, không phải '145' < '19' theo string)
Cách tổng quát hơn (tiền tố độ dài bất kỳ):
SUBSTRING(SoHoaDon, LENGTH('INV') + 1)