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
FROMklauzule taky) je - podle standardu SQL - neuspořádaná sada řádků. Řádky v tabulce (nebo v poddotazu vFROMdoložka) nepřicházejí v žádném konkrétním pořadí. Proto může optimalizátor ignorovatORDER BYklauzuli, kterou jste uvedli. Ve skutečnosti SQL standard ani neumožňujeORDER BYklauzule, 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
FROMklauzuli jako sadu řádků v nějakém nespecifikovaném a nedefinovaném pořadí a vložteORDER BYna 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.