mysql - Sortierung nach innerer Unterabfrage

8

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

    
G. Plante 15.10.2014, 00:18
quelle

1 Antwort

10

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:

%Vor%

Ohne das LIMIT gibt es keinen guten Grund, die Sortierung innerhalb der Unterabfrage anzuwenden. Es kann äquivalent auf die äußere Abfrage angewendet werden.

Dokumentiertes Verhalten:

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 der FROM -Klausel) haben keine bestimmte Reihenfolge. Aus diesem Grund kann der Optimierer die von Ihnen angegebene ORDER BY -Klausel ignorieren. Tatsächlich erlaubt der SQL-Standard nicht einmal, dass die ORDER BY -Klausel in dieser Unterabfrage erscheint (wir erlauben es, weil ORDER 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 die ORDER BY auf die oberste Ebene SELECT 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.

    
Michael Berkowski 15.10.2014, 00:36
quelle