Сортировка по пустоте

VANHALEN

Новичок
ORDER BY ISNULL( position ) DESC, position , id ASC // сначала пустые
ORDER BY ISNULL( position ) ASC , position, id ASC // сначала непустые
Нет... я совсем не это имел ввиду. Уж чем отличается DESC от ASC я прекрасно знаю.. Проблемма как раз в том, что в этом примере (специально скриншот прикрутил) сначала выводятся результаты с незаполненым "position", кстати правильно отсортированные, а только потом с заполненым и тоже правильно отсортированные, а надо то как раз с пустой позицией пото выводить.. Я как раз спрашивал как будет ISNULL наоборот, а не ASC
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Спасибо, никогда не использовал expression в ORDER BY.
Не нашел информацию, в этом случае будет использоваться INDEX position, если нет, на больших объёмах будет тормозить?
на больших объемах NULL не используется
 

Semen

Семён
Тебе уже всё расписали, если этого не понимаешь, проще нанять программиста...
 

VANHALEN

Новичок
a давай просто напишем на английском вопрос ТСа null last in mysql
Это было бы лучшее решение если бы не одно но
PHP:
SELECT * FROM `menu` WHERE `group` = 1 ORDER BY `position` ASC NULLS LAST, `id` DESC
Не работает. Да вобщем и по первой же ссылке ответ такой - NULLS LAST в mysql не работает (does not work with mysql, only sql ). Подозреваю, что если в какой-то версии и работает, то полагаться на это не стоит
 

WMix

герр M:)ller
Партнер клуба
он говорит о слове пусто значит пустой стринг
ORDER BY ISNULL( position ) , position, id ASC
в этом случае ORDER BY position != '' , position, id ASC
ORDER BY FIND_IN_SET( if(position is null ,'empty', 'not_empty') , 'not_empty, empty' )
в этом ORDER BY FIND_IN_SET( if(position = '' ,'empty', 'not_empty') , 'not_empty, empty' )
один краток, другой на все случаи жизни, "сначало лето потом зима потом осень потом весна" ничего умного не написанно!
 

VANHALEN

Новичок
в этом случае ORDER BY position != '' , position, id ASC
Ну вроде решено.. Только у меня работает наоборот. Вот так
PHP:
SELECT * FROM `menu` WHERE `group` = $group ORDER BY position = '' ASC, position ASC, id ASC
Если спрашивать как ты, то пустой position опять вначале будет.

Подчеркну - проблемму помог решить WMix
 

С.

Продвинутый новичок
критерий экзотичности сможешь дать?
Неадекватность, это когда выясняется, что не предусмотрел нечто, но вместо того чтобы вернуться назад и отрефакторить как надо "в лоб", создается костылек с оверхедом. Редкий, неочевидный, экзотичный на столько, что его вариации либо не документируются, либо вообще не реализуются.

И дело даже не 66666 или какой другой волшебной константе. Достаточно просто переделать логику где `position` не номер в списке, а "вес" (чем больше, тем выше). Соответственно все NULLевые оказываются автоматом в конце.
 

VANHALEN

Новичок
Кстати я и сам там накосячил по невнимательности. Тип position был varchar. Заметил разумеется случайно, когда колличество подпунктов одного из меню достигло 10.
Переделал..
ORDER BY ISNULL( position ) DESC, position , id ASC // сначала пустые
ORDER BY ISNULL( position ) ASC , position, id ASC // сначала непустые
всё равно не работает как надо. Потом ещё попробую на всякий случай NULLS LAST. Ну да и ладно, проблемма решена уже
 

HEm

Сетевой бобер
Имхо не своем верный подход.. Как таковой, сортировки по id не будет, хотя пункт меню уберётся в зад. А если их создали 5, 10? В каком они порядке тогда между собой выстроются?
А вот остальные советы испробую обязательно.. Отпишусь, когда сделаю..

P.S. По поводу тормозов - ну сколько в меню не "мега портала" будет ответов при запросе? Принибрежительное колличество. Хотя подход правильный. И к тому же обратите внимание на поле "group". Это собственно и есть меню.. Одно сверху, другое снизу, слева, справа.. ТОесть много всяко не будет.
ORDER BY order_id, id или ORDER BY order_id, last_create

если специально не сортировали, то в очередности создания
 

WMix

герр M:)ller
Партнер клуба
VANHALEN

неважно varvchar или int,
NULL нужно для начала в поле разрешить, но это еще и значение,
чтоб найти ISNULL( position ) нужно чтоб хотяб одна position была равна NULL
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
С., это ты тихо сам с собою на своей волне? или в огороде бузина, а в городе дядька?
 

HEm

Сетевой бобер
varchar сортирует правильно, по алфавиту
хочешь чтобы сортировал как числа - ORDER BY fild*1
 
Сверху