пʼятницю, 8 квітня 2016 р.

Сортировка MYSQL, нулевые значения - в конец.

Итак, мы решили хранить в базе данных некоторые сущности, для которых хотим вручную задавать очередность сортировки при выборке. Ну, например, список меню.
Структура БД (я сознательно перепутал все, для наглядности.):
menuID  |  menuName  |  menuTitle  | menuArrange
    1     |   menu-3   |   Третий    |     30
    2     |   menu-2   |   Второй    |     20
    3     |   menu-1   |   Первый    |     10
    4     |   menu-4   |  Четвертый  |     40
Если во всех записях `menuArrange` заполнено, то всё замечательно, делаем запрос и получаем предсказуемый порядок:
SELECT menuArrange, menuTitle 
FROM table_menu 
ORDER BY menuArrange
/*
 * 10 | Первый
 * 20 | Второй
 * 30 | Третий
 * 40 | Четвертый
 */
Но зачем же заполнять вручную `menuArrange`? В большинстве случаев список будет заполняться сразу в нужном порядке, а вручную очередность указать нужно будет лишь иногда:
menuID  |  menuName  |  menuTitle  | menuArrange
    1     |   menu-1   |   Первый    |    
    2     |   menu-2   |   Второй    |    
    3     |   menu-3   |   Третий    |    
    4     |   menu-4   |  Четвертый  |    
 И тут мы решили добавить два пункта в самое начало:
    5     |   menu-0   |   Нулевой   |     20
    6     |   menu--1  |   Минус 1й  |     10
И вот тут уже получается что для того, чтобы соблюсти правильную последовательность, нужно будет указать menuArrange для всех пунктов меню, иначе первые 4 будут болтаться в начале. Или же сделать так, чтобы все меню с пустым `menuArrange` прыгнули в самый конец списка. Этот вариант мне нравится намного больше:
SELECT menuArrange, menuTitle 
FROM table_menu 
ORDER BY 
  CASE WHEN menuArrange IS NULL THEN 1 ELSE 0 END,
  menuArrange
/*
 * 10 | Минус 1й
 * 20 | Нулевой
 *    | Первый
 *    | Второй
 *    | Третий
 *    | Четвертый
 */

Немає коментарів :

Дописати коментар