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

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

Решение
Используйте функцию 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() может применяться для сортировки любых значений в произвольном порядке, если естественный порядок этих значений не представляет интереса..



Оцените статью: (0 голосов)
0 5 0

Статьи из раздела MySQL на эту тему:
Использование ORDER BY для сортировки результатов запроса
Размещение некоторых значений в начале или конце упорядоченного списка
Сортировка IP-адресов в числовом порядке
Сортировка значений ENUM
Сортировка и значения NULL