MySQL/MariaDB - um von innen Unterabfrage
Ich habe folgende Abfrage mit MySQL 5.5 (oder früheren Versionen) seit Jahren ohne Probleme:
SELECT t2.Code from (select Country.Code from Country order by Country.Code desc ) AS t2;
Die Reihenfolge der Ergebnis war immer absteigend, wie ich brauchte.
Letzte Woche, als ich gerade migriert, um eine neue MySQL-Version (In der Tat habe ich die Migration zu MariaDB 10.0.14) und jetzt die gleiche Abfrage mit der gleichen Datenbank absteigend sortiert mehr. Es ist aufsteigend sortiert (sortiert mithilfe der natürlichen Ordnung, nicht sicher, in der Tat).
So, kann jemand mir sagen könnte ob das ein bug ist oder ob dies eine änderung des Verhaltens in neueren Versionen von MySQL/MariaDB?
- Möglicherweise relevant: mariadb.com/kb/en/mariadb/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach ein bisschen Graben, kann ich bestätigen, sowohl Ihre Szenarien:
MySQL 5.1 gilt die
ORDER BY
innerhalb der Unterabfrage.MariaDB 5.5.39 auf Linux nicht gelten die
ORDER BY
innerhalb der Unterabfrage wenn keineLIMIT
geliefert wird. Es hat jedoch korrekt anwenden können, um, wenn eine entsprechendeLIMIT
gegeben:Ohne dass
LIMIT
gibt es nicht einen guten Grund, um die Sortierung innerhalb der Unterabfrage. Es kann sinngemäß angewandt, um die äußere Abfrage.Dokumentierten Verhalten:
Als es stellt sich heraus, MariaDB hat, dokumentiert dieses Verhalten und es gilt nicht als Fehler:
Damit MariaDB auch empfiehlt, das
ORDER BY
in der äußeren Abfrage, oder eineLIMIT
wenn nötig.Hinweis: ich habe derzeit nicht den Zugang zu einem richtigen MySQL 5.5 oder 5.6 zu bestätigen, ob das Verhalten identisch ist, da (und SQLFiddle.com defekt ist). Kommentare auf dem ursprünglichen bug-report (geschlossen als not-a-bug), deuten darauf hin, dass MySQL 5.6 wahrscheinlich verhält sich auf die gleiche Weise wie MariaDB.
order by
nicht zu gelten in einer Unterabfrage ist es nicht? Ich glaube nicht, dass irgendeine db garantieren, dass die Bestellung.select distinct / order by / limit
ist viel langsamer alsselect distinct from (select order by) limit
- mit ein paar Millionen Zeilen, die Differenz ist in der Größenordnung von 1000x.SELECT t1.* FROM (SELECT * FROM table ORDER BY value_col DESC) AS t1 GROUP BY group_col
um die maximalevalue_col
für jedengroup_col
. Wenn ich ORDER BY, ich möchte die Datenbank auf, um es, egal, ob er denkt, dass es eine gute Idee ist oder nicht.In neueren Versionen von MySQL und MariaDB Sie können erzwingen, dass der ORDER BY im sub-query durch anwenden einer GRENZE. Wenn Sie nicht wollen, zu begrenzen, die Zeilen, verwenden Sie die größte Anzahl von BIGINT als LIMIT.
Dieses kann in handliches kommen zu Zeiten, wenn der sub Abfragen generiert werden, in einer gewünschten Reihenfolge für die Anwendung der Linie zahlen, zum Beispiel.