Итак, мы решили хранить в базе данных некоторые сущности, для которых хотим вручную задавать очередность сортировки при выборке. Ну, например, список меню.
Структура БД (я сознательно перепутал все, для наглядности.):
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 | Нулевой
* | Первый
* | Второй
* | Третий
* | Четвертый
*/