Существует поле "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, сделали свое дело.