Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL/MariaDB - Sortierung nach interner Unterabfrage

Nach ein wenig Graben kann ich Ihre beiden Szenarien bestätigen:

MySQL 5.1 wendet den ORDER BY an innerhalb der Unterabfrage.

MariaDB 5.5.39 unter Linux nicht wenden Sie den ORDER BY an innerhalb der Unterabfrage, wenn kein LIMIT ist versorgt. Das tut es Allerdings gilt der Auftrag korrekt, wenn ein entsprechendes LIMIT gegeben ist:

SELECT t2.Code 
FROM (
  SELECT Country.Code FROM Country ORDER BY Country.Code DESC LIMIT 2
) AS t2;

Ohne dieses 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 Unterabfrage im FROM auch Klausel) ist - nach dem SQL-Standard - eine ungeordnete Menge von Zeilen. Zeilen in einer Tabelle (oder in einer Unterabfrage im FROM Klausel) stehen in keiner bestimmten Reihenfolge. Deshalb kann der Optimierer ORDER BY ignorieren Klausel, die Sie angegeben haben. Tatsächlich erlaubt der SQL-Standard nicht einmal den ORDER BY -Klausel in dieser Unterabfrage erscheinen (wir erlauben es, weil ORDER BY ... LIMIT ... ändert das Ergebnis, die Menge der Zeilen, nicht nur ihre Reihenfolge).

Sie müssen die Unterabfrage im FROM behandeln -Klausel, als Satz von Zeilen in einer nicht spezifizierten und undefinierten Reihenfolge, und setzen Sie den ORDER BY auf der obersten Ebene SELECT .

Daher empfiehlt MariaDB auch die Anwendung des ORDER BY in der äußersten Abfrage oder ein LIMIT falls nötig.

Hinweis:Ich habe derzeit keinen Zugriff auf ein geeignetes MySQL 5.5 oder 5.6, um zu bestätigen, ob das Verhalten dort dasselbe ist (und SQLFiddle.com nicht funktioniert). Kommentare zum ursprünglichen Fehlerbericht (als kein Fehler geschlossen) legen nahe, dass sich MySQL 5.6 wahrscheinlich genauso verhält wie MariaDB.