Ich habe die folgende Abfrage mit MySQL 5.5 (oder früheren Versionen) seit Jahren ohne Probleme verwendet:
%Vor%Die Reihenfolge des Ergebnisses war immer absteigend, wie ich es brauchte.
Letzte Woche habe ich nur auf eine neue MySQL-Version migriert (tatsächlich bin ich nach MariaDB 10.0.14 gewandert) und jetzt wird dieselbe Abfrage mit derselben Datenbank nicht mehr absteigend sortiert. Es wird aufsteigend sortiert (oder sortiert nach der natürlichen Reihenfolge, nicht sicher in der Tat).
Kann mir also jemand sagen, ob das ein Bug ist oder ob dies eine Änderung des Verhaltens in neueren Versionen von MySQL / MariaDB ist?
Danke.
G. Plante
Nach ein wenig Graben kann ich beide Szenarien bestätigen:
MySQL 5.1 wendet das ORDER BY
in der Unterabfrage an.
MariaDB 5.5.39 unter Linux nicht wendet das ORDER BY
in der Unterabfrage an, wenn kein LIMIT
angegeben wird. It tut jedoch korrekt die Reihenfolge, wenn ein entsprechendes LIMIT
angegeben wird:
Ohne das LIMIT
gibt es keinen guten Grund, die Sortierung innerhalb der Unterabfrage anzuwenden. Es kann äquivalent auf die äußere Abfrage angewendet werden.
Wie sich herausstellt, MariaDB hat dieses Verhalten dokumentiert und es wird nicht als Fehler angesehen:
Eine "Tabelle" (und auch eine Unterabfrage in der
FROM
-Klausel) ist - gemäß dem SQL-Standard - eine ungeordnete Menge von Zeilen. Zeilen in einer Tabelle (oder in einer Unterabfrage in derFROM
-Klausel) haben keine bestimmte Reihenfolge. Aus diesem Grund kann der Optimierer die von Ihnen angegebeneORDER BY
-Klausel ignorieren. Tatsächlich erlaubt der SQL-Standard nicht einmal, dass dieORDER BY
-Klausel in dieser Unterabfrage erscheint (wir erlauben es, weilORDER BY ... LIMIT
... das Ergebnis, die Menge der Zeilen, nicht nur ihre Reihenfolge ändert).Sie müssen die Unterabfrage in der
FROM
-Klausel als eine Reihe von Zeilen in einer nicht angegebenen undefinierten Reihenfolge behandeln und dieORDER BY
auf die oberste EbeneSELECT
setzen.
Daher empfiehlt MariaDB auch, dass ORDER BY
in der äußersten Abfrage oder LIMIT
bei Bedarf angewendet wird.
Hinweis: Ich habe derzeit keinen Zugriff auf ein korrektes MySQL 5.5 oder 5.6, um zu bestätigen, ob das Verhalten dort dasselbe ist (und SQLFiddle.com funktioniert nicht richtig). Kommentare zum ursprünglichen Fehlerbericht (geschlossen als Nicht-Fehler) deuten darauf hin, dass sich MySQL 5.6 wahrscheinlich genauso verhält als MariaDB.
Tags und Links sql mysql sql-order-by mariadb subquery