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
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'
dlaENUM('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 kolumnieENUM
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)
lubORDER 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)
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.
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.)
Ten sposób sortowania ENUM może być bardzo przydatny w niektórych przypadkach! To naprawdę działa, próbowałem :) –
perfekcyjnie to, czego szukałem – Andrew
Ten będzie pracować w SQLite też. – nuqqsa