2015-11-21 3 views
0

Вы можете помочь мне здесь?Сортировать по стоимости, но игнорируйте ноль

Я делаю простой SQL-запрос для календаря, в котором перечислены некоторые значения (дата, время и т. Д. Как UNIX-время) в соответствии с их значениями и ограничено 5 записями.

Соответствующая часть строки запроса заключается в следующем:

ORDER BY specialtime DESC, `start` ASC, programstart ASC 

Колонка под названием «specialtime» перечисляет эти значения:

432000 
259200 
172800 
0 
0 
0 
0 

Это почти нормально - но я хотел бы записи со значением, отличные от нуля, чтобы появиться в порядке возрастания - и после них остальные, также восходящие ...:

172800 
259200 
432000 
0 
0 
0 
0 

Есть ли способ сделать это в SQL, не полагаясь на пост-обработку значений?

ответ

5

Проверьте специальное время 0 и сортировать по этому выражению в первую очередь:

ORDER BY specialtime = 0, specialtime ASC, `start` ASC, programstart ASC 

MySQL treats boolean expressions as integers, так ложным значением 0 и истинным принимает значение 1. Вы можете сортировать по такому выражению и каждая строка, где specialtime = 0 оценивается как true, перемещается в нижнюю часть списка.

Или, немного дольше, но и более компактен, и, возможно, легче понять:

ORDER BY CASE WHEN specialtime = 0 THEN 1 ELSE 0 END, specialtime ASC, `start` ASC, programstart ASC 

Выражение СЛУЧАЙ возвращает 0 (из specialtime не 0) или 1 (если specialtime является 0). Запрос сортируется в основном на этом значении, поэтому все 0 раз находятся в нижней части списка. Таким образом, в основном функциональность одна и та же, но версия с case более портативна, так как не многие базы данных позволяют сортировать по булевскому выражению.

Значение specialtime используется для вторичной сортировки, поэтому, если эта группа specialtime = 0 возвращает false, записи по-прежнему сортируются по фактическому значению специального времени.

+0

Реальный хороший. Строго зависит от MySQL, но тогда возникает вопрос о MySQL –

+0

@ PM77-1 Вот что я подумал, хотя теперь я добавил и более портативную версию. – GolezTrol

+1

Возможно, вы захотите упомянуть, что MySQL имеет целочисленное представление true/false, чтобы объяснить, как работает ваше 1-е решение. –

Смежные вопросы