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

Sắp xếp theo thứ tự chuỗi tùy chỉnh trong MySQL (ORDER BY FIELD)

ORDER BY FIELD(): Sắp xếp theo danh sách giá trị tự định nghĩa

Hàm FIELD(cot, val1, val2, ...) trả về vị trí của giá trị trong danh sách. Dùng trong ORDER BY để sắp xếp theo thứ tự mong muốn.

Cú pháp

SELECT * FROM tenBang
ORDER BY FIELD(cotTen, 'GiaTri1', 'GiaTri2', 'GiaTri3', ...);

Ví dụ: Sắp xếp hãng xe theo thứ tự ưu tiên

Bảng OrderByListOfStrings:

CREATE TABLE OrderByListOfStrings (
    Id INT NOT NULL AUTO_INCREMENT,
    CarName VARCHAR(20),
    PRIMARY KEY (Id)
);
INSERT INTO OrderByListOfStrings (CarName) VALUES
('Ford'), ('Audi'), ('Honda'), ('Aston Martin'), ('Bugatti'), ('BMW');

Muốn thứ tự: Bugatti, BMW, Audi, Aston Martin, Ford, Honda:

SELECT * FROM OrderByListOfStrings
ORDER BY FIELD(CarName, 'Bugatti', 'BMW', 'Audi', 'Aston Martin', 'Ford', 'Honda');

Kết quả

+----+--------------+
| Id | CarName      |
+----+--------------+
|  5 | Bugatti      |
|  6 | BMW          |
|  2 | Audi         |
|  4 | Aston Martin |
|  1 | Ford         |
|  3 | Honda        |
+----+--------------+

Xử lý giá trị không có trong danh sách

Giá trị không nằm trong FIELD() trả về 0 → sẽ xuất hiện đầu tiên nếu ASC (mặc định).

Giải pháp: Thêm giá trị mặc định vào cuối FIELD() hoặc dùng CASE:

ORDER BY CASE 
    WHEN CarName IN ('Bugatti','BMW','Audi','Aston Martin','Ford','Honda') 
         THEN FIELD(CarName, 'Bugatti','BMW','Audi','Aston Martin','Ford','Honda')
    ELSE 999 END;

Ứng dụng thực tế

  • Sắp xếp trạng thái đơn hàng: 'pending', 'confirmed', 'shipping', 'delivered', 'cancelled'.
  • Thứ tự ưu tiên: 'VIP', 'Premium', 'Standard', 'Free'.
  • Báo cáo tùy chỉnh theo yêu cầu business.

Lưu ý

  • FIELD() chỉ có MySQL. PostgreSQL dùng CASE hoặc ARRAY_POSITION.
  • Phân biệt chữ hoa/thường theo collation của cột.