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

mysql:Wie kann ORDER BY nach LEFT JOIN ohne Neuordnung gespeichert werden?

(Erklärt den Verlust von ORDER BYs )

Der SQL-Standard besagt im Wesentlichen, dass eine Unterabfrage eine ungeordnete Menge von Zeilen ist. Dies impliziert, dass der Optimierer den ORDER BYs ignorieren kann in der 'abgeleiteten' Tabelle:FROM ( SELECT ... ORDER BY ) . In "neueren" Versionen von MySQL und MariaDB sind solche ORDER BYs werden fallen gelassen. Es gibt andere Fälle, in denen ORDER BYs wird ignoriert.

In einigen Situationen (bei diesem hier nicht sicher), indem Sie ein LIMIT 99999999 hinzufügen (große Zahl) nach dem ORDER BYs bringt den Optimierer dazu, ORDER BYs auszuführen . Es steht jedoch immer noch frei, die "Bestellung" später zu ignorieren.

Eine allgemeine Regel für MySQL:Vermeiden Sie Unterabfragen. (Es gibt Fälle, in denen Unterabfragen schneller sind, aber nicht Ihre.)

Eine strenge Regel:Sie müssen einen ORDER BYs haben ganz außen, wenn die Ergebnisse sortiert werden sollen.

Wenn Sie LIMIT 3 hinzugefügt haben in der abgeleiteten Tabelle in Ihrer ersten Abfrage erhalten Sie nur CHARLES, DAVID, JAMES, aber nicht unbedingt in dieser Reihenfolge . Das heißt, Sie benötigen zwei ORDER BYs - eine in der abgeleiteten Tabelle, eine ganz am Ende.