MySQL от Поля Дюбуа, 2-е издание

Whatsername

Новичок
MySQL от Поля Дюбуа, 2-е издание

В тестовой базе данных есть таблица president.
В таблице содержатся имена, даты рождения и другая информация о президентах Америки.
У ныне живущих президентов в графе death стоит значение NULL.

Дюбуа пишет:
"Чтобы отсортировать президентов по дате смерти, но при этом поместить живущих президентов ( со значением смерти NULL) в начало списка, используйте:

SELECT * FROM president ORDER BY IF(death IS NULL,0,1), death;

А чтобы поместить живущих президентов в конец списка:

SELECT * FROM president ORDER BY IF(death IS NULL,1,0), death;

В первом случае IF присваивает строкам с пустыми датами смерти значения 0, а строкам с датами смерти - значения 1, тем самым помещая все строки без даты смерти перед строками с датой смерти. Во втором случае все происходит наоборот".

Меня смущает объяснение: где тут "присваивание"? Все ли так на самом деле происходит? При том, что работает правильно!
 

Whatsername

Новичок
Vital_N,
я может совсем кефира перепил, но перед тем как разместить вопрос я прочел эту линку, и не нашел разъяснений словам Дюбуа.
 

Vital_N

Новичок
IF(expr1,expr2,expr3)
Если expr1 равно значению ИСТИНА - то функция IF() возвращает expr2, в противном случае - expr3

т.е получится сортировка по результат IF(death IS NULL,1,0), потом по death - для некоторых строк будет 0, death - для других 1, death - те, что с нулями будут в начале -
 

Whatsername

Новичок
0, death - сортировка по death
1, death - сортировка по первому столбцу, а с учетом его по death
Ты это имел ввиду?
Спасибо за твои ответы Vital.
 

Vital_N

Новичок
нет - тутдве сортировки - сначала идет по выражению а потом по death
 

Whatsername

Новичок
Мда, Vital, сорри, я плакать и не понимать.
Еще раз прочел про ORDER BY, IF и IS NULL, ничего подобного там не написано.

Позволь, я еще раз объясню систему, которая кажется мне логичной, и от которой я отталкиваюсь:
#######
SELECT * FROM president ORDER BY IF(death IS NULL,0,1), death;
#######
1. Выбрать все из таблицы президент
2. Сортировать выборку по номеру столбца и колонке death
Если death - это NULL => сортируем только по death
Если death - это не NULL => сортируем только по первой колонке, а потом по death.

Мне понятно, что если об этом писал Дюбуа и ты пишешь один в один тоже самое - так и есть... тем паче, что сортировать по нулевому столбцу нельзя - это ошибка.

НО в мануле описан только один вариант для ORDER BY, принимающим более одного значения - это сортировка сперва для столбца_равного_первому_значению, а затем для столбца_соответствующего_второму_значению.

http://dev.mysql.com/doc/mysql/ru/sorting-rows.html
 

Vital_N

Новичок
Violator откуда номер столбца?

идут две сортировки, первая по несуществующему столбцу (вычисляемое выражение) а потом по death
 

Whatsername

Новичок
Автор оригинала: Vital_N
откуда номер столбца?
SELECT * FROM president ORDER BY 1; - сортировка по первому столбцу.

SELECT * FROM president ORDER BY 2; - сортировка по второму столбцу.

etc...

SELECT * FROM president ORDER BY IF(death IS NULL,0,1), death;

Я упорно читаю как:
1.death IS NULL --> true
сортировка по death
2.death IS NULL --> false
сортировка по первому столбцу таблицы и по death.
 

Whatsername

Новичок
Да...
писал об этом дважды, как и о том, что _чувствую_ что это неверно, но синтаксис представляется мне однозначным:

IF(death IS NULL,0,1) разрешается в 0 или 1, so во втором случае - сортируем по первому столбцу, а в первом случае должна возникать ошибка... (ошибки не возникает)

Я не могу уловить сам факт присваивания:
IF(death IS NULL,0,1) - _возвращает_ значение, а не _присваивает_ его.
 

Фанат

oncle terrible
Команда форума
Violator, во-первых, ты должен понимать, что Дюбуа писал НЕ НА РУССКОМ языке. И что читаешь ты перевод. поэтому придираться к словам ты можешь, конечно. Но претензии предьявляй не нам, а переводчику.
Что до меня, то, в данном контексте - что "возвращает", что "присваивает" - один хрен.

Во-вторых, сделай так
SELECT * FROM president ORDER BY IF(death IS NULL,'a','b'), death;
возможно, это наведёт тебя на какие-то мысли.

-~{}~ 05.04.05 11:51:

Да...
писал об этом дважды, как и о том, что _чувствую_ что это неверно, но синтаксис представляется мне однозначным:

IF(death IS NULL,0,1) разрешается в 0 или 1, so во втором случае - сортируем по первому столбцу, а в первом случае должна возникать ошибка... (ошибки не возникает)
интересно.
если следовать этой логике, то получается так:
у меня есть поле num, в котором есть числа от 1 до 3, к примеру.
получается, что написав order by num, я сортирую, оказывается, по столбцам от 1до 3
причём в каждой строчке - по-разному.
 

Vital_N

Новичок
Violator, повторю IF(expr1,expr2,expr3)
Если expr1 равно значению ИСТИНА - то функция IF() возвращает expr2, в противном случае - expr3

т.е получится сортировка по результат IF(death IS NULL,1,0), потом по death - для некоторых строк будет 0, death - для других 1, death - Отсортируем их и получится что те что с нулями будут первыми а потом идут те, что с единицей, плюс все еще отсортbрованы по death
 

Фанат

oncle terrible
Команда форума
в общем, если уж самым простым языком объяснять, то кто-то путает ЗАПРОС, и его РЕЗУЛЬТАТ.
считать, что по результатам IF(death IS NULL,0,1) указывается номер столбца, а не ЕГО СОДЕРЖИМОЕ, это всё равно, что считать, будто при запросе select name from table запрос вернёт "name" для всех строк
 

Whatsername

Новичок
Спасибо вам, Vital N и Фанат.
Фанат, разумеется, я нимало не предъявляю претензий не к переводчику, не к автору, тем более, не к вам... думаю, это и так понятно.
Огромное спасибо Вам за терпение и помощь.
Не хочу лукавить - мне не понятна такая схема работы мускула, но дергать вас тоже не хочу - кажется, это проблемы моих природных способностей, нежели трудностей перевода Дюбуа. Но я ничего не задвигаю - очень ценю то, что вы нашли время ответить, я обязательно разрулю эти моменты (или застрелюсь в конце концов =))) Спасибо.
 

Vital_N

Новичок
Violator если поставить явно order by 1, death - то сортировка будет происходить сначала по первому столбцу - потом по death - но если там стоит вычисляемое выражение - то вместо него образуется как бы псевдо-столбец - значение которого и будет занчение этого выражения, т.е. мы сортируем по этому псевдо-столбцу а потом по death
 

Фанат

oncle terrible
Команда форума
никакой не псевдо.
а совершенно полноценный самостоятельный столбец.
его можно указывать в селекте.
мы получаем столбец с некими значениями, и по нему сортируем. просто указываем его не в селекте, а в ордере.

что тут не понятно, Violator - я не понимаю.
 

Vital_N

Новичок
Фанат да он полноценый, но я его так обозвал, чтобы было понятно - что в таблице его нет и мы сам создаем его при запросе
 

SelenIT

IT-лунатик :)
Violator
сделай так для наглядности:[sql]
SELECT *, IF(death IS NULL,'alive','dead') AS is_dead FROM president ORDER BY is_dead, death;[/sql]
в столбце is_dead будет тот самый результат проверки.
 
Сверху