Существует поле "noticeBy" enum ( "электронная почта", "мобильный", "все", "авто", "ничего" ) NOT NULL DEFAULT "auto". Как известно, упорядочение по полю ENUM выполняется по отношению к его индексу. Однако как можно сделать порядок по его значениям?
ORDER BY "ENUM field" в MYSQL
Ответ 1
Как описано в Sorting:
Значения
ENUM
сортируются по их номерам индексов, которые зависят от порядка, в котором перечисляемые элементы перечислены в спецификации столбца. Например,'b'
сортирует до'a'
дляENUM('b', 'a')
. Пустая строка сортирует перед непустыми строками, а значенияNULL
сортируются перед всеми другими значениями перечисления.Чтобы предотвратить неожиданные результаты при использовании предложения
ORDER BY
в столбцеENUM
, используйте один из следующих способов:
Укажите список
ENUM
в алфавитном порядке.Убедитесь, что столбец отсортирован лексически, а не номером индекса, путем кодирования
ORDER BY CAST(col AS CHAR)
илиORDER BY CONCAT(col)
.
Для второго пуля вы можете сортировать по столбцу после cast строки:
ORDER BY CAST(noticeBy AS CHAR)
Ответ 2
Это также работает:
ORDER BY FIELD(noticeBy, 'all','auto','email','mobile','nothing')
(Я не верю, что для этого есть настройка, вы должны указать значения сортировки.)
Ответ 3
Вы можете определить свой заказ, как хотите:
ORDER BY CASE noticeBy
WHEN 'email' THEN 1
WHEN 'mobile' THEN 2
WHEN 'all' THEN 3
WHEN 'auto' THEN 4
ELSE 5
END
Это вернет строки в следующем порядке: электронная почта, мобильный, все, авто, ничего.
Ответ 4
В моем случае мне пришлось отсортировать результаты перечисления по полю "ENUM", а также убедиться, что значения находятся в порядке убывания. Мое перечисление имело следующие значения: 'Open','Closed'
Поэтому, когда я использовал ORDER BY CAST(status AS CHAR)
, результаты были в следующем порядке:
Closed
Open
Open
Но я хотел, чтобы сначала были показаны билеты статуса Open
, а затем билеты Closed
. Поэтому я использовал следующее:
ORDER BY CAST(status AS CHAR) DESC
Это дало мне заказ, который я искал, т.е.
Open
Open
Closed
Резюме:
Использование ORDER BY CAST
для перечисления не помогло. Чтобы отсортировать результаты в определенном порядке, упомянув также ASC
или DESC
, сделали свое дело.