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

Форум MySQL

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

 

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

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Двойная сортировка по одному столбцу

Сообщения:  [1-10]   [11-18] 

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

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

  Ответить  
 
 автор: Лена   (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;
>


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

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

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

  Ответить  
 
 автор: 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 в 00:09)   письмо автору
 
   для: Trianon   (15.12.2010 в 21:44)
 

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

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

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

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

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

  Ответить  
 
 автор: Лена   (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 в 14:13)   письмо автору
 
   для: Лена   (15.12.2010 в 13:50)
 

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

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

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

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

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

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


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

  Ответить  

Сообщения:  [1-10]   [11-18] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

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