Чёрт когда-то дёрнул связаться с MySQL (5.5.41-MariaDB), теперь пожинаю последствия. Есть такой запрос, он был сгенерирован провайдером MySQL EF, и упрощён мной для лучшей демонстрации:
select
k.c1 as c2,
k.c2 as c1
from (
select users.user_id as c1,
1 as c2
from users
) as k
order by k.c1 desc
Колонки во внешнем селекте называются также как и во внутреннем, в order by явно указана колонка из внутреннего селекта. Тем не менее сортировка происходит по внешнему, т.е. по c1 = k.c2 = 1.
MS SQL ведёт себя ожидаемо (выводит user_id в обратном порядке), а тут какая-то очередная причуда.
Есть этому какое-то объяснение (с точки зрения MySQL), или это просто очередной баг мускула?
UPD. Вопрос снимается: если колонки переименовать то всё работает как надо, так что однозначно баг MariaDB.
Здравствуйте, Somescout, Вы писали:
S> Колонки во внешнем селекте называются также как и во внутреннем, в order by явно указана колонка из внутреннего селекта.
Это как понимать? Колонка k.c1 — как раз из внешнего, во внутреннем алиас таблицы — "users". Да и нельзя в order by ссылаться на колонки из внутреннего — это синтаксически неверно.
S> Тем не менее сортировка происходит по внешнему, т.е. по c1 = k.c2 = 1.
Как указано, так и происходит.
S> MS SQL ведёт себя ожидаемо (выводит user_id в обратном порядке), а тут какая-то очередная причуда.
Бесполезно ожидать какого-либо порядка, если он не указан явно. По k.c1 набор упорядочен, а дальше сервер выводит так, как ему удобнее. Например, по кластерному индексу.
S> Есть этому какое-то объяснение (с точки зрения MySQL), или это просто очередной баг мускула?
Это баг ожиданий.
Hardware eventually fails. Software eventually works. ::: avalon/1.0.442
S>> MS SQL ведёт себя ожидаемо (выводит user_id в обратном порядке), а тут какая-то очередная причуда.
W>Бесполезно ожидать какого-либо порядка, если он не указан явно. По k.c1 набор упорядочен, а дальше сервер выводит так, как ему удобнее. Например, по кластерному индексу.
так k.c1 как раз и есть user_id. или я чего-то недопонимаю?
Здравствуйте, night beast, Вы писали:
NB>Здравствуйте, wildwind, Вы писали:
S>>> MS SQL ведёт себя ожидаемо (выводит user_id в обратном порядке), а тут какая-то очередная причуда.
W>>Бесполезно ожидать какого-либо порядка, если он не указан явно. По k.c1 набор упорядочен, а дальше сервер выводит так, как ему удобнее. Например, по кластерному индексу.
NB>так k.c1 как раз и есть user_id. или я чего-то недопонимаю?
Всё верно. Имелось в веду, конечно же (и это следует из sql) что ссылается на результирующую колонку внутреннего селекта.
Здравствуйте, wildwind, Вы писали:
W>P.S. На предыдущее сообщение прошу не обращать внимания.
Вовремя ты, а то я уж телегу накатал разгромную. Удивился дико, прочитав подобное от тебя.
Здравствуйте, wildwind, Вы писали:
W>Здравствуйте, Somescout, Вы писали:
S>> Есть этому какое-то объяснение (с точки зрения MySQL), или это просто очередной баг мускула?
W>У меня не воспроизводится. http://sqlfiddle.com/#!2/0256f/1
W>