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

Sắp xếp cột văn bản để lấy giá trị lớn nhất theo phần số trong MySQL

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

  1. Lọc hàng có tiền tố mong muốn: WHERE StudentCode LIKE 'STUDENT%'
  2. Tách phần số: RIGHT(StudentCode, LENGTH(StudentCode) - LENGTH('STUDENT'))
  3. Ép kiểu sang số: CAST(... AS UNSIGNED)
  4. 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') = 7
  • LENGTH('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.