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

Sắp xếp chuỗi có số (A1, A2, A10...) đúng thứ tự tự nhiên trong MySQL

Sắp xếp chuỗi kiểu A1, A10, A2 theo thứ tự chữ cái rồi số tự nhiên: tách phần chữ và phần số, sắp xếp phần chữ theo chữ, phần số theo giá trị số.

Cú pháp

SELECT * 
FROM ten_bang 
ORDER BY SUBSTR(cot, 1, 1), CAST(SUBSTR(cot, 2) AS UNSIGNED);

Giả định: 1 ký tự chữ cái đầu, phần còn lại là số. Điều chỉnh SUBSTR nếu pattern khác.

Ví dụ minh họa

Tạo bảng OrderByStringWithNumbers:

CREATE TABLE OrderByStringWithNumbers (
    Id INT NOT NULL AUTO_INCREMENT,
    Words VARCHAR(10), PRIMARY KEY (Id)
);

INSERT INTO OrderByStringWithNumbers (Words) VALUES
('A10'), ('A30'), ('A12'), ('A11'), ('A28'), ('A21');

Sắp xếp mặc định (lexicographic): A10, A11, A12, A21, A28, A30 → sai (A10 < A2).

Sắp xếp tự nhiên

SELECT * 
FROM OrderByStringWithNumbers 
ORDER BY SUBSTR(Words, 1, 1), CAST(SUBSTR(Words, 2) AS UNSIGNED);

Kết quả đúng:

+----+-------+
| Id | Words |
+----+-------+
|  1 | A10   |
|  4 | A11   |
|  3 | A12   |
|  6 | A21   |
|  5 | A28   |
|  2 | A30   |
+----+-------+

Mở rộng cho pattern phức tạp (MySQL 8.0+):

ORDER BY 
  CAST(REGEXP_SUBSTR(cot, '^[^0-9]+') AS CHAR),  -- phần chữ
  CAST(REGEXP_SUBSTR(cot, '[0-9]+$') AS UNSIGNED) -- phần số

Tách tự động phần chữ và số cuối, không cần biết độ dài cố định.