MySQL Orderby по числу, нуля последний - PullRequest
248 голосов
/ 12 января 2010

В настоящее время я делаю очень простой OrderBy в своем заявлении.

SELECT * FROM tablename WHERE visible=1 ORDER BY position ASC, id DESC

Проблема в том, что записи NULL для 'position' обрабатываются как 0. Поэтому все записи с позицией как NULL появляются раньше, чем записи с 1,2,3,4. например:

NULL, NULL, NULL, 1, 2, 3, 4

Есть ли способ добиться следующего заказа:

1, 2, 3, 4, NULL, NULL, NULL.

Ответы [ 10 ]

522 голосов
/ 18 ноября 2011

MySQL имеет недокументированный синтаксис для сортировки нулей в последнюю очередь. Поместите знак минус (-) перед именем столбца и переключите ASC на DESC:

SELECT * FROM tablename WHERE visible=1 ORDER BY -position DESC, id DESC

Это, по сути, обратное значение position DESC, в котором значения NULL ставятся последними, но в остальном совпадают с position ASC.

Хорошая ссылка здесь http://troels.arvin.dk/db/rdbms#select-order_by

283 голосов
/ 16 ноября 2010

Я считаю, что это хорошее решение по большей части:

SELECT * FROM table ORDER BY ISNULL(field), field ASC;
24 голосов
/ 12 января 2010

Что-то вроде

SELECT * FROM tablename where visible=1 ORDER BY COALESCE(position, 999999999) ASC, id DESC

Замените 999999999 на максимальное значение для поля

.
15 голосов
/ 20 декабря 2016

NULL LAST

SELECT * FROM table_name ORDER BY id IS NULL, id ASC
4 голосов
/ 02 февраля 2016

Попробуйте использовать этот запрос:

SELECT * FROM tablename
WHERE visible=1 
ORDER BY 
CASE WHEN position IS NULL THEN 1 ELSE 0 END ASC,id DESC
3 голосов
/ 19 сентября 2017
SELECT * FROM tablename WHERE visible=1 ORDER BY CASE WHEN `position` = 0 THEN 'a' END , position ASC
3 голосов
/ 12 января 2010

Вы можете объединить свои значения NULL в операторе ORDER BY:

select * from tablename
where <conditions>
order by
    coalesce(position, 0) ASC, 
    id DESC

Если вы хотите, чтобы значения NULL сортировались снизу, попробуйте coalesce(position, 100000). (Сделайте второе число больше, чем все остальные position в БД.)

3 голосов
/ 12 января 2010

Вы можете поменять экземпляры NULL с другим значением, чтобы отсортировать их сначала (например, 0 или -1) или в последний раз (большое число или буква) ...

SELECT field1, IF(field2 IS NULL, 9999, field2) as ordered_field2
  FROM tablename
 WHERE visible = 1
 ORDER BY ordered_field2 ASC, id DESC
2 голосов
/ 16 августа 2016

Для столбца DATE вы можете использовать:


NULLS последнее:

ORDER BY IFNULL(`myDate`, '9999-12-31') ASC

Заготовки последними:

ORDER BY IF(`myDate` = '', '9999-12-31', `myDate`) ASC
0 голосов
/ 13 декабря 2011

Почему бы вам не заказать NULLS LAST?

SELECT * 
FROM tablename
WHERE visible = 1 
ORDER BY position ASC NULLS LAST, id DESC 
...