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

Sắp xếp theo quy tắc tùy chỉnh 4,2,1,3 trong MySQL?

Giải pháp: ORDER BY FIELD()

Hàm FIELD(str, val1, val2, ...) trả về vị trí 1-based của str trong danh sách, hoặc 0 nếu không có. Dùng để sắp xếp theo thứ tự tùy ý.

Ví dụ minh họa

Tạo bảng và dữ liệu

mysql> CREATE TABLE DemoTable (Number INT);
mysql> INSERT INTO DemoTable VALUES(1), (4), (2), (3);

Dữ liệu gốc

+--------+
| Number |
+--------+
| 1      |
| 4      |
| 2      |
| 3      |
+--------+

Truy vấn: Thứ tự 4, 2, 1, 3

mysql> SELECT * FROM DemoTable ORDER BY FIELD(Number, 4, 2, 1, 3);

Kết quả

+--------+
| Number |
+--------+
| 4      |  <-- FIELD=1
| 2      |  <-- FIELD=2
| 1      |  <-- FIELD=3
| 3      |  <-- FIELD=4
+--------+

Giải thích FIELD()

  • FIELD(4, 4,2,1,3) = 1
  • FIELD(2, 4,2,1,3) = 2
  • FIELD(1, 4,2,1,3) = 3
  • FIELD(3, 4,2,1,3) = 4
  • FIELD(5, 4,2,1,3) = 0 (giá trị khác) → xếp cuối mặc định

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

-- Xếp cuối (mặc định FIELD=0, ASC)
ORDER BY FIELD(Number, 4,2,1,3)

-- Xếp đầu
ORDER BY FIELD(Number, 4,2,1,3) DESC

-- Tách riêng: trong danh sách trước, ngoài sau
ORDER BY (FIELD(Number, 4,2,1,3) = 0) ASC, FIELD(Number, 4,2,1,3) ASC

So sánh FIELD vs CASE

Phương phápVí dụƯu điểm
FIELD()ORDER BY FIELD(col, 4,2,1,3)Ngắn, đọc dễ, danh sách giá trị
CASEORDER BY CASE col WHEN 4 THEN 1 WHEN 2 THEN 2...Linh hoạt điều kiện phức tạp
FIND_IN_SETORDER BY FIND_IN_SET(col, '4,2,1,3')Chuỗi CSV, chậm hơn

Ứng dụng thực tế

Sắp xếp status workflow

ORDER BY FIELD(status, 'draft', 'review', 'approved', 'published', 'archived')

Sắp xếp size

ORDER BY FIELD(size, 'XS', 'S', 'M', 'L', 'XL', 'XXL')

Sắp xếp priority

ORDER BY FIELD(priority, 'critical', 'high', 'medium', 'low')

Lưu ý

  • FIELD() chỉ hoạt động với giá trị rời rạc (không phải range)
  • Không dùng index cho ORDER BY FIELD()
  • Bảng lớn: Thêm cột sort_order INT pre-computed