2013-07-11 29 views
24

Có một trường 'noticeBy' enum ('email', 'di động', 'tất cả', 'tự động', 'không có gì') NOT NULL DEFAULT 'auto'. Vì nó được biết đến theo thứ tự của trường ENUM thực hiện liên quan đến chỉ mục của nó. Tuy nhiên, làm thế nào nó có thể làm cho trật tự bằng các giá trị của nó?ORDER BY "ENUM field" trong MYSQL

Trả lời

43

Như ghi nhận dưới Sorting:

ENUM giá trị được sắp xếp dựa trên số chỉ mục của chúng, tùy thuộc vào thứ tự các thành viên liệt kê được liệt kê trong đặc tả cột. Ví dụ: 'b' sắp xếp trước 'a' cho ENUM('b', 'a'). Chuỗi trống sắp xếp trước các chuỗi không phải rỗng và các giá trị NULL sắp xếp trước tất cả các giá trị đếm khác.

Để ngăn chặn kết quả bất ngờ khi sử dụng mệnh đề ORDER BY trên một cột ENUM, sử dụng một trong những kỹ thuật này:

  • Xác định danh sách ENUM theo thứ tự alphabetic.

  • Đảm bảo rằng cột được sắp xếp theo từ điển thay vì theo số chỉ mục bằng mã hóa ORDER BY CAST(col AS CHAR) hoặc ORDER BY CONCAT(col).

mỗi viên đạn thứ hai, bạn có thể do sắp xếp trên cột sau khi nó đã được cast thành một chuỗi:

ORDER BY CAST(noticeBy AS CHAR) 
9

Bạn có thể xác định đặt hàng của bạn tuy nhiên bạn muốn:

ORDER BY CASE noticeBy 
      WHEN 'email' THEN 1 
      WHEN 'mobile' THEN 2 
      WHEN 'all' THEN 3 
      WHEN 'auto' THEN 4 
      ELSE 5 
     END 

này sẽ trả lại hàng theo thứ tự sau: email, điện thoại di động, tất cả, tự động, không có gì.

+0

Cái này sẽ làm việc trong SQLite quá. – nuqqsa

31

này cũng hoạt động:

ORDER BY FIELD(noticeBy, 'all','auto','email','mobile','nothing') 

(Tôi không tin rằng có một thiết lập để đạt được điều này, bạn phải cung cấp các loại-giá trị.)

+2

Cách sắp xếp ENUM này có thể rất hữu ích trong một số trường hợp! Nó thực sự hoạt động, tôi đã thử nó :) –

+0

hoàn hảo chính xác những gì tôi đang tìm kiếm – Andrew