Сортировка по значениям ENUM поля в MYSQL: решение

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

SQL
Скопировать код
SELECT * FROM your_table ORDER BY FIND_IN_SET(your_enum_column, 'value1,value2,value3');

Для сортировки данных по колонке ENUM применяйте функцию FIND_IN_SET(), указывая желаемую очередность значений ENUM, разделяя их запятыми, в составляющей ORDER BY. Этот прием позволяет достичь требуемой последовательности значений без применения сложных конструкций типа CASE или объединений таблиц.

Кинга Идем в IT: пошаговый план для смены профессии

Принципы сортировки ENUM

Колонки ENUM в MySQL можно сравнить с маршрутом автобуса, где каждая остановка — это одно из возможных значений. Порядок следования определяется не по названиям остановок, а по их порядковым числам.

Индексная сортировка значений ENUM

Колонка ENUM в MySQL представляет строку, выбранную из заранее определенного перечня. Значения нумеруются с 1. Следовательно, значение, занимающее первое место в этом списке, будет предшествовать всем остальным.

SQL
Скопировать код
# По умолчанию сортировка MySQL осуществляется по индексу!
SELECT * FROM your_table ORDER BY your_enum_column;

Сортировка ENUM как строк

Чтобы отсортировать значения ENUM по алфавиту, преобразуйте типы с помощью функции CAST():

SQL
Скопировать код
# Преобразуем значения ENUM в текст для сортировки!
SELECT * FROM your_table ORDER BY CAST(your_enum_column AS CHAR);

Персонализированная сортировка с помощью FIELD()

Для установки индивидуального порядка сортировки применяйте функцию FIELD():

SQL
Скопировать код
# Определяем свой собственный порядок значений ENUM в MySQL!
SELECT * FROM your_table ORDER BY FIELD(your_enum_column, 'email', 'mobile', 'all', 'auto', 'nothing');

Точный контроль с помощью CASE

Оператор CASE предоставляет полную свободу в установке порядка значений ENUM:

SQL
Скопировать код
# Устанавливаем собственный порядок сортировки значений ENUM с использованием CASE!
SELECT *
FROM your_table
ORDER BY 
  CASE your_enum_column
    WHEN 'email' THEN 1
    WHEN 'mobile' THEN 2
    WHEN 'all' THEN 3
    WHEN 'auto' THEN 4
    WHEN 'nothing' THEN 5
    ELSE 6
  END;

Особенности сортировки ENUM – что происходит за кулисами

Особенности работы с NULL

Значения NULL будут отображаться в начале списка, полученного при запросе SELECT, так как они считаются меньше любых других значений.

SQL
Скопировать код
# Значения NULL всегда находятся на переднем плане при сортировке!
SELECT * FROM your_table ORDER BY your_enum_column;

Варьируем сортировку: по возрастанию или убыванию

Используйте ASC или DESC для сортировки значений ENUM по возрастанию или убыванию соответственно.

SQL
Скопировать код
# Решаем, в каком порядке мы хотим видеть значения ENUM!
SELECT * FROM your_table ORDER BY CAST(your_enum_column AS CHAR) DESC;

При применении FIELD() всегда проверяйте актуальное значение ENUM в таблице.

Визуализация

Вот каким образом меняется последовательность цветов до и после применения ORDER BY ENUM:

Markdown
Скопировать код
До сортировки по ENUM:
🟢🔵🔴🟣🟡 – настоящее праздник оттенков!

После сортировки по ENUM:
🔴🟡🟢🔵🟣 – по умолчанию синий и фиолетовый занимают свои места!

Как улучшить эффективность работы с ENUM

Вопросы производительности: скорость сортировки

Сортировка по индексу работает быстрее сортировки строк, что важно учесть, если вам приоритетна производительность.

Подводные камни ENUM

Обратите внимание на количество возможных значений ENUM; их избыток может усложнить работу. Изменения в ENUM требуют усилий, поэтому планируйте их заранее.

ENUM и другие базы данных

ENUM тесно связывает вашу систему с MySQL, поэтому стоит вдумчиво подойти к применению этого типа данных.

Полезные материалы

  1. MySQL :: Руководство по MySQL 8.0 :: 5.3.4.4 Сортировка строк — Официальная документация MySQL по сортировке строк. Очень рекомендуется к ознакомлению.
  2. Настройка Mercurial: Один центральный репозиторий или несколько? – Stack Overflow — Неожиданный источник, содержащий точные сведения о сортировке значений типа ENUM.
  3. MySQL :: Руководство по MySQL 8.0 :: 13.3.5 Тип ENUM — Обширный обзор типа ENUM в MySQL.
  4. Использование MySQL ENUM правильным образом – за и против — Все плюсы и минусы использования типа ENUM.
  5. postgresql – sql ORDER BY нескольких значений в определенном порядке? – Stack Overflow — Аналогичные задачи и решения для задания пользовательской сортировки, но уже применительно к SQL.