Сортировка по значениям ENUM поля в MYSQL: решение
Быстрый ответ
SELECT * FROM your_table ORDER BY FIND_IN_SET(your_enum_column, 'value1,value2,value3');
Для сортировки данных по колонке ENUM применяйте функцию FIND_IN_SET()
, указывая желаемую очередность значений ENUM, разделяя их запятыми, в составляющей ORDER BY
. Этот прием позволяет достичь требуемой последовательности значений без применения сложных конструкций типа CASE
или объединений таблиц.
Принципы сортировки ENUM
Колонки ENUM в MySQL можно сравнить с маршрутом автобуса, где каждая остановка — это одно из возможных значений. Порядок следования определяется не по названиям остановок, а по их порядковым числам.
Индексная сортировка значений ENUM
Колонка ENUM в MySQL представляет строку, выбранную из заранее определенного перечня. Значения нумеруются с 1. Следовательно, значение, занимающее первое место в этом списке, будет предшествовать всем остальным.
# По умолчанию сортировка MySQL осуществляется по индексу!
SELECT * FROM your_table ORDER BY your_enum_column;
Сортировка ENUM как строк
Чтобы отсортировать значения ENUM по алфавиту, преобразуйте типы с помощью функции CAST()
:
# Преобразуем значения ENUM в текст для сортировки!
SELECT * FROM your_table ORDER BY CAST(your_enum_column AS CHAR);
Персонализированная сортировка с помощью FIELD()
Для установки индивидуального порядка сортировки применяйте функцию FIELD()
:
# Определяем свой собственный порядок значений ENUM в MySQL!
SELECT * FROM your_table ORDER BY FIELD(your_enum_column, 'email', 'mobile', 'all', 'auto', 'nothing');
Точный контроль с помощью CASE
Оператор CASE
предоставляет полную свободу в установке порядка значений ENUM:
# Устанавливаем собственный порядок сортировки значений 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, так как они считаются меньше любых других значений.
# Значения NULL всегда находятся на переднем плане при сортировке!
SELECT * FROM your_table ORDER BY your_enum_column;
Варьируем сортировку: по возрастанию или убыванию
Используйте ASC
или DESC
для сортировки значений ENUM по возрастанию или убыванию соответственно.
# Решаем, в каком порядке мы хотим видеть значения ENUM!
SELECT * FROM your_table ORDER BY CAST(your_enum_column AS CHAR) DESC;
При применении FIELD()
всегда проверяйте актуальное значение ENUM в таблице.
Визуализация
Вот каким образом меняется последовательность цветов до и после применения ORDER BY ENUM
:
До сортировки по ENUM:
🟢🔵🔴🟣🟡 – настоящее праздник оттенков!
После сортировки по ENUM:
🔴🟡🟢🔵🟣 – по умолчанию синий и фиолетовый занимают свои места!
Как улучшить эффективность работы с ENUM
Вопросы производительности: скорость сортировки
Сортировка по индексу работает быстрее сортировки строк, что важно учесть, если вам приоритетна производительность.
Подводные камни ENUM
Обратите внимание на количество возможных значений ENUM; их избыток может усложнить работу. Изменения в ENUM требуют усилий, поэтому планируйте их заранее.
ENUM и другие базы данных
ENUM тесно связывает вашу систему с MySQL, поэтому стоит вдумчиво подойти к применению этого типа данных.
Полезные материалы
- MySQL :: Руководство по MySQL 8.0 :: 5.3.4.4 Сортировка строк — Официальная документация MySQL по сортировке строк. Очень рекомендуется к ознакомлению.
- Настройка Mercurial: Один центральный репозиторий или несколько? – Stack Overflow — Неожиданный источник, содержащий точные сведения о сортировке значений типа ENUM.
- MySQL :: Руководство по MySQL 8.0 :: 13.3.5 Тип ENUM — Обширный обзор типа ENUM в MySQL.
- Использование MySQL ENUM правильным образом – за и против — Все плюсы и минусы использования типа ENUM.
- postgresql – sql ORDER BY нескольких значений в определенном порядке? – Stack Overflow — Аналогичные задачи и решения для задания пользовательской сортировки, но уже применительно к SQL.