В моем заявлении я делаю очень простой OrderBy.
SELECT * FROM tablename WHERE visible=1 ORDER BY position ASC, id DESC
Проблема заключается в том, что записи NULL для "позиции" обрабатываются как 0. Поэтому все записи с позицией NULL отображаются перед теми, у кого 1,2,3,4. например:
NULL, NULL, NULL, 1, 2, 3, 4
Есть ли способ добиться следующего порядка:
1, 2, 3, 4, NULL, NULL, NULL.
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
- col_name
является выражением ( 0 - col_name
), которое принимает предложение ORDER BY. Конечно, это работает только для числовых столбцов.
date
и time
! (MySQL 5.5). Я думаю (мне лень проверять) это работает для всех числовых столбцов (timestamp, float ...).
Я нашел это хорошим решением по большей части:
SELECT * FROM table ORDER BY ISNULL(field), field ASC;
SELECT * FROM table ORDER BY ISNULL(field) ASC;
(MySQL 5.5)
SELECT *, position = '' as has_position FROM table ORDER BY has_position, position
Что-то вроде
SELECT * FROM tablename where visible=1 ORDER BY COALESCE(position, 999999999) ASC, id DESC
Замените 999999999 тем, что максимальное значение для поля
NULL LAST
SELECT * FROM table_name ORDER BY id IS NULL, id ASC
Попробуйте использовать этот запрос:
SELECT * FROM tablename
WHERE visible=1
ORDER BY
CASE WHEN position IS NULL THEN 1 ELSE 0 END ASC,id DESC
SELECT * FROM tablename WHERE visible=1 ORDER BY CASE WHEN `position` = 0 THEN 'a' END , position ASC
Вы можете coalesce ваши NULL в инструкции ORDER BY
:
select * from tablename
where <conditions>
order by
coalesce(position, 0) ASC,
id DESC
Если вы хотите, чтобы NULL сортировались в нижней части, попробуйте coalesce(position, 100000)
. (Сделайте второе число больше, чем все остальные position
в db.)
Вы можете поменять местами 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
Для столбца DATE
вы можете использовать:
NULLS last:
ORDER BY IFNULL(`myDate`, '9999-12-31') ASC
Бланки последние:
ORDER BY IF(`myDate` = '', '9999-12-31', `myDate`) ASC
Почему вы не заказываете NULLS LAST?
SELECT *
FROM tablename
WHERE visible = 1
ORDER BY position ASC NULLS LAST, id DESC
NULLS LAST
- какая версия MySQL была представлена?