Để sắp xếp đúng thứ tự số cho giá trị như '2X', '2Y', '2Z', '100X', '100Y', '100Z', dùng ORDER BY (col+0), RIGHT(col, 1).
Tạo bảng và dữ liệu
mysql> CREATE TABLE DemoTable (StudentId VARCHAR(100)); Query OK, 0 rows affected (0.52 sec)
mysql> INSERT INTO DemoTable VALUES('2X'), ('100Y'), ('100X'), ('2Z'), ('2Y'), ('100Z');
Query OK, 6 rows affected (0.21 sec)
Truy vấn sắp xếp alphanumeric
mysql> SELECT * FROM DemoTable ORDER BY (StudentId + 0), RIGHT(StudentId, 1);
Kết quả:
+-----------+ | StudentId | +-----------+ | 2X | | 2Y | | 2Z | | 100X | | 100Y | | 100Z | +-----------+ 6 rows in set, 6 warnings (0.00 sec)
Giải thích:
StudentId + 0: ép kiểu chuỗi sang số, lấy phần số đầu ('2X'→2, '100Y'→100). Cảnh báo "Truncated incorrect DOUBLE value" là bình thường.RIGHT(StudentId, 1): lấy ký tự cuối (X, Y, Z) để sắp xếp phụ
Cách chuẩn hơn (MySQL 8.0): ORDER BY CAST(StudentId AS UNSIGNED), SUBSTRING(StudentId, LENGTH(CAST(StudentId AS UNSIGNED)) + 1)