MySQL / 6. Сортировка результатов запроса

Сортировка в порядке, определенном пользователем

Задача
Вы хотите определить порядок сортировки для всех значений столбца.

Решение
Используйте функцию FIELD() для отображения значений столбцов на последовательность, располагающую значения в нужном порядке.

Обсуждение
В предыдущем разделе было показано, как переместить указанную группу строк в начало упорядоченного списка. Если вы хотите определить специальный порядок для всех значений столбца, примените функцию FIELD(), которая сопоставит их списку числовых значений, и используйте сортировку для чисел. FIELD() сравнивает свой первый аргумент со следующими и возвращает число, показывающее, с которым из них он совпадает. Следующий вызов FIELD() сравнивает аргумент value с аргументами str1, str2, str3 и str4 и возвращает 1, 2, 3 или 4 в зависимости от того, какому из аргументов равно значение value:

FIELD(value,str1,str2,str3,str4)

Значений для сравнения не обязательно должно быть четыре; FIELD() принимает список аргументов переменной длины. Если value – это NULL или совпадения нет, FIELD() возвращает 0.

Функцию FIELD() можно использовать для сортировки произвольного множества значений в любом порядке. Например, чтобы вывести записи табли-цы driver_log для имен Henry, Suzi и Ben именно в таком порядке, выполните запрос:

mysql> SELECT * FROM driver_log
-> ORDER BY FIELD(name,'Henry','Suzi','Ben');

+--------+-------+---------------+------+
| rec_id | name  | trav_date    | miles |
+--------+-------+---------------+-------+
| 3         | Henry | 2001-11-29 | 300   |
| 4         | Henry | 2001-11-27 | 96     |
| 6         | Henry | 2001-11-26 | 115   |
| 8         | Henry | 2001-12-01 | 197   |
| 10       | Henry | 2001-11-30 | 203   |
| 2         | Suzi    | 2001-11-29 | 391   |
| 7         | Suzi    | 2001-12-02 | 502   |
| 1         | Ben    | 2001-11-30 | 152   |
| 5         | Ben    | 2001-11-29 | 131   |
| 9         | Ben    | 2001-12-02 | 79     |
+-------+--------+--------------+-------+

FIELD() можно использовать и для подстрок столбцов. Чтобы упорядочить элементы таблицы housewares по стране изготовления в порядке US, UK, JP, SG, сделайте так:

mysql> SELECT id, description FROM housewares
-> ORDER BY FIELD(RIGHT(id,2),'US','UK','JP','SG');

+---------------+---------------------+
| id                   | description           |
+---------------+---------------------+
| DIN40672US | dining table          |
| BTH00485US | shower stall         |
| KIT00372UK  | garbage disposal |
| KIT01729JP   | microwave oven  |
| BTH00415JP  | lavatory               |
| BED00038SG | bedside lamp        |
+----------------+---------------------+

Если обобщить, FIELD() может применяться для сортировки любых значений в произвольном порядке, если естественный порядок этих значений не представляет интереса.

Статьи по MySQL на эту тему:

Сортировка значений ENUM