Подтвердить что ты не робот

ORDER BY "ENUM field" в MYSQL

Существует поле "noticeBy" enum ( "электронная почта", "мобильный", "все", "авто", "ничего" ) NOT NULL DEFAULT "auto". Как известно, упорядочение по полю ENUM выполняется по отношению к его индексу. Однако как можно сделать порядок по его значениям?

4b9b3361

Ответ 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, сделали свое дело.