2013-07-11 21 views
24

Bir alan 'noticeBy' enum ('email', 'mobile', 'all', 'auto', 'nothing') NOT NULL DEFAULT 'auto'. ENUM tarafından sipariş edildiği bilinen alan, dizinine göre çalışır. Ancak, değerleri ile nasıl sipariş verilebilir?ORDER BY "ENUM alanı" içinde MYSQL

cevap

43

Sorting altında belgelendiği gibi:

ENUM değerleri numaralandırma üyeleri kolon tarifnamede listelenen sırayla bağlıdır indeks numarası, göre sıralanır. Örneğin, 'b', için 'a''dan önce sıralar. Boş dize, kullanılmayan dizelerden önce sıralar ve diğer tüm numaralandırma değerlerinden önce NULL değerleri sıralar. Bir ENUM sütun üzerinde ORDER BY maddesini kullanırken

beklenmeyen sonuçlar önlemek için şu tekniklerden birini kullanın:

  • alfabetik sırayla ENUM listesi belirtin. Sütun ORDER BY CAST(col AS CHAR) veya ORDER BY CONCAT(col) kodlayarak dizin numarasına değil, sözcüklere göre sıralanmış olduğundan emin olun. İkinci mermi Başına

, bu nedenle sıralama sütun üzerinde bir dizeye cast olmuştur edebilirsiniz sonra:

ORDER BY CAST(noticeBy AS CHAR) 
9

Sen sipariş tanımlayabilirsiniz ancak istediğiniz: Tüm, oto, hiçbir şey e-posta, mobil:

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

Bu aşağıdaki sırayla satırları dönecektir.

+0

Bu seferki çok SQLite'ta çalışacaktır. – nuqqsa

31

Bu aynı zamanda çalışır:

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

(Ben bunu başarmak için bir ayarı vardır inanmıyorum, sıralama-değerlerini sağlamak zorunda.)

+2

Bu şekilde ENUM sıralama, bazı durumlarda çok yararlı olabilir! Gerçekten işe yarıyor, denedim :) –

+0

tam olarak ne aradığımı – Andrew