2013-07-11 16 views
24

Istnieje pole "noticeBy" enum ("email", "mobile", "all", "auto", "nic") NOT NULL DEFAULT "auto". Jak wiadomo, porządkowanie przez pole ENUM odbywa się względem jego indeksu. Jak jednak można uporządkować według jej wartości?ORDER BY "pole ENUM" w MYSQL

Odpowiedz

43

Jak udokumentowano pod Sorting:

ENUM Wartości są sortowane na podstawie ich numerów indeksowych, które zależą od kolejności występowania elementów wyliczeniowych w specyfikacji kolumny. Na przykład 'b' sortuje przed 'a' dla ENUM('b', 'a'). Pusty łańcuch sortuje przed niepustymi ciągami, a wartości przed wszystkimi innymi wartościami wyliczenia sortuje.

Aby zapobiec niespodziewane wyniki przy użyciu klauzuli ORDER BY na kolumnie ENUM użyć jedną z tych technik:

  • określić listę w kolejności alfabetycznej ENUM.

  • Upewnij się, że kolumna jest posortowana leksykalnie, a nie według numeru indeksu, kodując ORDER BY CAST(col AS CHAR) lub ORDER BY CONCAT(col).

Za drugim pociskiem, można zatem porządek na kolumnie po jego cast do łańcucha:

ORDER BY CAST(noticeBy AS CHAR) 
9

Można zdefiniować swoje zamówienie jednak chcesz:

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

ten powróci wiersze w następującej kolejności: e-mail, telefon komórkowy, wszystko, auto, nic.

+0

Ten będzie pracować w SQLite też. – nuqqsa

31

Działa to również:

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

(nie wierzę, że jest tam ustawienie, aby to osiągnąć, trzeba zapewnić sortowania wartości.)

+2

Ten sposób sortowania ENUM może być bardzo przydatny w niektórych przypadkach! To naprawdę działa, próbowałem :) –

+0

perfekcyjnie to, czego szukałem – Andrew