Po chvíli rýpání mohu potvrdit oba vaše scénáře:
MySQL 5.1 používá ORDER BY
uvnitř poddotazu.
MariaDB 5.5.39 na Linuxu ne použijte ORDER BY
uvnitř poddotazu, když není LIMIT
je dodáván. dělá správně však aplikujte objednávku, když je odpovídající LIMIT
je dáno:
SELECT t2.Code
FROM (
SELECT Country.Code FROM Country ORDER BY Country.Code DESC LIMIT 2
) AS t2;
Bez tohoto LIMIT
, není dobrý důvod použít řazení uvnitř poddotazu. Lze jej ekvivalentně použít na vnější dotaz.
Zdokumentované chování:
Jak se ukázalo, MariaDB toto chování zdokumentovala a není to považováno za chybu:
"Tabulka" (a dílčí dotaz v
FROM
klauzule taky) je - podle standardu SQL - neuspořádaná sada řádků. Řádky v tabulce (nebo v poddotazu vFROM
doložka) nepřicházejí v žádném konkrétním pořadí. Proto může optimalizátor ignorovatORDER BY
klauzuli, kterou jste uvedli. Ve skutečnosti SQL standard ani neumožňujeORDER BY
klauzule, aby se objevila v tomto dílčím dotazu (povolujeme to, protožeORDER BY ... LIMIT
... změní výsledek, sadu řádků, nejen jejich pořadí).Musíte ošetřit poddotaz v
FROM
klauzuli jako sadu řádků v nějakém nespecifikovaném a nedefinovaném pořadí a vložteORDER BY
na nejvyšší úrovniSELECT
.
MariaDB tedy také doporučuje použít ORDER BY
v nejvzdálenějším dotazu nebo LIMIT
v případě potřeby.
Poznámka:V současné době nemám přístup ke správné MySQL 5.5 nebo 5.6, abych si ověřil, zda je tam chování stejné (a SQLFiddle.com nefunguje). Komentáře k původní zprávě o chybě (uzavřeno jako not-a-bug) naznačuje, že MySQL 5.6 se pravděpodobně chová stejně jako MariaDB.