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
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'
choENUM('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ộtENUM
, 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ặcORDER 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)
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ì.
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ị.)
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ó :) –
hoàn hảo chính xác những gì tôi đang tìm kiếm – Andrew
Cái này sẽ làm việc trong SQLite quá. – nuqqsa