Wenn Sie eine ORDER BY
Klausel in einer Unterabfrage verwenden, die in Verbindung mit einer UNION
MySQL verwendet wird, wird die ORDER BY
Klausel optimiert .
Dies liegt daran, dass a standardmäßig eine UNION
ungeordnete Liste zurückgibt, sodass a ORDER BY
nichts tun würde.
Die Optimierung wird in den Dokumenten erwähnt und sagt:
Um ORDER BY oder LIMIT auf eine einzelne SELECT anzuwenden, setzen Sie die Klausel in die Klammern, die die SELECT einschließen:
(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10) UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);
Die Verwendung von ORDER BY für einzelne SELECT-Anweisungen impliziert jedoch nichts über die Reihenfolge, in der die Zeilen im Endergebnis angezeigt werden, da UNION standardmäßig eine ungeordnete Reihe von Zeilen erzeugt. Daher wird die Verwendung von ORDER BY in diesem Kontext normalerweise in Verbindung mit LIMIT verwendet, sodass die Teilmenge der ausgewählten Zeilen ermittelt wird, die für SELECT abgerufen werden sollen, obwohl dies nicht unbedingt die Reihenfolge dieser Zeilen in der Liste beeinflusst endgültiges UNION-Ergebnis. Wenn ORDER BY ohne LIMIT in einem SELECT angezeigt wird, wird es wegoptimiert, da es ohnehin keine Auswirkung hat.
Der letzte Satz ist etwas irreführend, weil er eine Wirkung haben sollte. Diese Optimierung verursacht ein Problem, wenn Sie sich in einer Situation befinden, in der Sie innerhalb der Unterabfrage bestellen müssen.
Um MySQL zu zwingen, diese Optimierung nicht durchzuführen, können Sie eine LIMIT-Klausel wie folgt hinzufügen:
(SELECT 1 AS rank, id, add_date FROM my_table WHERE distance < 5 ORDER BY add_date LIMIT 9999999999)
UNION ALL
(SELECT 2 AS rank, id, add_date FROM my_table WHERE distance BETWEEN 5 AND 15 ORDER BY rank LIMIT 9999999999)
UNION ALL
(SELECT 3 AS rank, id, add_date from my_table WHERE distance BETWEEN 5 and 15 ORDER BY id LIMIT 9999999999)
Ein High LIMIT
bedeutet, dass Sie OFFSET
der Gesamtabfrage eine hinzufügen können, wenn Sie beispielsweise eine Paginierung durchführen möchten.
Dies gibt Ihnen auch den zusätzlichen Vorteil, dass Sie ORDER BY
für jede Union unterschiedliche Spalten verwenden können.