Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Двойная сортировка по одному столбцу
 
 автор: zsaz   (15.12.2010 в 05:07)   письмо автору
 
 

Есть столбец:
NUMBER
3
4
5
NULL
2
1
NULL
6


Мне его нужно отсортировать по возрастанию, но чтобы NULL были последние, т.е. должно получиться:
NUMBER
1
2
3
4
5
6
NULL
NULL

Обычная сортировка ORDER BY NUMBER на первое место ставит NULL, а потом только числа

  Ответить  
 
 автор: lightning.say   (15.12.2010 в 06:45)   письмо автору
 
   для: zsaz   (15.12.2010 в 05:07)
 

попробуйте так:
 ... ORDER BY NUMBER WHEN `название столбца`='NULL' THEN 1 ELSE 0 END, `название столбца` ... 

  Ответить  
 
 автор: zsaz   (15.12.2010 в 08:44)   письмо автору
 
   для: lightning.say   (15.12.2010 в 06:45)
 

Не работает. сделал так:
SELECT * FROM `users` WHERE 1 ORDER BY `number` WHEN `number`='NULL' THEN 1 ELSE 0 END

  Ответить  
 
 автор: lightning.say   (15.12.2010 в 09:38)   письмо автору
 
   для: zsaz   (15.12.2010 в 08:44)
 

не все-таки это не то...

  Ответить  
 
 автор: Лена   (15.12.2010 в 11:38)   письмо автору
 
   для: zsaz   (15.12.2010 в 08:44)
 


SELECT *
FROM `users`
ORDER BY
CASE number
WHEN `number` IS NULL
THEN 1
ELSE 0
END

  Ответить  
 
 автор: Trianon   (15.12.2010 в 12:52)   письмо автору
 
   для: Лена   (15.12.2010 в 11:38)
 

Вообще-то тут каша накручена order by((number == isnull(number)) ? 1 : 0)
Можно было бы написать так

SELECT *
  FROM `users`
  ORDER BY
  CASE 
    WHEN `number` IS NULL  THEN 1999999999
    ELSE number
   END 

но это коряво. И предполагает что чисел выше 1999999999 в столбике не встретится.

Проще и корректнее так:

SELECT *
  FROM `users`
  ORDER BY
    `number` IS NULL DESC, 
    `number` ASC
 

  Ответить  
 
 автор: lightning.say   (15.12.2010 в 13:02)   письмо автору
 
   для: Trianon   (15.12.2010 в 12:52)
 

а вы работу их проверяли?
первый
3
1
5
2
1
6
(NULL)
(NULL)

второй
(NULL)
(NULL)
1
2
3
4
5
6

а надо что бы (NULL) в конце было а не в начале

  Ответить  
 
 автор: Trianon   (15.12.2010 в 13:11)   письмо автору
 
   для: lightning.say   (15.12.2010 в 13:02)
 

нет, конечно - я принцип показал.
DESC на ASC изменить - и всё нормально будет.
или вообще модификаторы убрать:
SELECT *
  FROM `users`
  ORDER BY    `number` IS NULL ,  `number`

  Ответить  
 
 автор: Лена   (15.12.2010 в 13:50)   письмо автору
 
   для: Trianon   (15.12.2010 в 13:11)
 

Мне больше нравится

SELECT *
FROM `users`
ORDER BY `number` DESC , `number` IS NULL


Так понятней, что сначала выбираем number, а после неопределенные number.

  Ответить  
 
 автор: Trianon   (15.12.2010 в 13:52)   письмо автору
 
   для: Лена   (15.12.2010 в 13:50)
 

не выйдет. человеку по возрастанию нужно.

  Ответить  
 
 автор: Trianon   (15.12.2010 в 14:13)   письмо автору
 
   для: Лена   (15.12.2010 в 13:50)
 

и принцип.
ORDER BY a,b,c означает не "сперва выбираем a, затем b, и под конец с"
Оно означает "
выражение a влияет на выбор первым. Если все значения a отличаются - определяемся по ним.
Если имеются строки с равными значениями a, то эти строки придется расставить, учитывая различие значений b.
И если остались строки в которых совпали и a и b - только тогда смотрим на c.
Строки, в которых совпала вся тройка, останутся расположены произвольным образом - в неопределенном порядке.
"

  Ответить  
 
 автор: Лена   (15.12.2010 в 21:38)   письмо автору
 
   для: Trianon   (15.12.2010 в 14:13)
 

Спасибо за объяснение, поняла.
А что происходит в случае, когда в сортируемом поле значения IS NULL?

SELECT *
FROM `users`
ORDER BY `number` IS NULL

Все значения неопределены, сортировка по идее ж не должна происходить. Как можно сортировать то, что не определено? Тем не менее в этом случае заполненные значения - в начале выборки, а значения IS NULL - последние.

  Ответить  
 
 автор: Trianon   (15.12.2010 в 21:44)   письмо автору
 
   для: Лена   (15.12.2010 в 21:38)
 

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

  Ответить  
 
 автор: Лена   (16.12.2010 в 00:09)   письмо автору
 
   для: Trianon   (15.12.2010 в 21:44)
 

у меня сомнения в понимании вот этой фразы:
вовсе даже значение вычисляемого выражения (expr IS NULL) , которое равно единице при неопределенном expr (сиречь при пустом поле), либо равно нулю при определенном expr (заполненном поле).

т.е. сначала вычисляется выражение, идущее после оператора ORDER BY - number IS NULL.
Если в данной ячейке значение неопределенное - значение выражения true,получаем 1,
если в ячейке значение непустое - получаем false, 0.

Спасибо, что разжевываете, случай интересный, первый раз такое вижу.

  Ответить  
 
 автор: Trianon   (16.12.2010 в 00:38)   письмо автору
 
   для: Лена   (16.12.2010 в 00:09)
 

да. именно так.
логические true и false в MySQL эквивалентны числовым 1 и 0
единственное number - вовсе не обязательно имено ячейка - это тоже в самом общем случае - выражение, может быть формулой, полем, константой наконец.
Константа, впрочем, конкретно в ORDER BY - не пришей кобыле хвост.
Но никто ж немешает написать
SELECT NULL IS NULL;
SELECT    1 IS NULL;
SELECT  1/0 IS NULL;
SELECT  0/1 IS NULL;

  Ответить  
 
 автор: Лена   (16.12.2010 в 14:23)   письмо автору
 
   для: Trianon   (16.12.2010 в 00:38)
 

>Константа, впрочем, конкретно в ORDER BY - не пришей кобыле хвост.

Почему? ORDER BY 1,2 - потому что неясно, по каким полям сортируется?

>Но никто ж немешает написать
>
SELECT NULL IS NULL;
>SELECT    1 IS NULL;
>SELECT  1/0 IS NULL;
>SELECT  0/1 IS NULL;
>


Такое на практике редко встречается.

  Ответить  
 
 автор: Trianon   (16.12.2010 в 14:44)   письмо автору
 
   для: Лена   (16.12.2010 в 14:23)
 

ORDER BY 1,2 это неортогональное исключение из правила.
Здесь 1, 2 не выражения агрегата сортировки, а номера колонок.
По всем канонам, за такое исключение автора соответствующей конструкции языка следовало бы выпороть на конюшне (хотя бы потому, что по большому счету, как реляционное отношение не зависит от порядка атрибутов, так и работа БД-приложения не должна зависеть от порядка колонок в таблице). Но языки частенько пишут неспециалисты...

  Ответить  
 
 автор: zsaz   (16.12.2010 в 04:28)   письмо автору
 
   для: Trianon   (15.12.2010 в 13:11)
 

Спасибо! Данный способ заработал.
SELECT * FROM users ORDER BY `number` IS NULL, `number`

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования