MySQL – Sortierung in UNION Statements

Heute sind meine Frau und ich über ein kleines My-SQL-Problem gestolpert. Wir hatten ein Statement der Art

( SELECT .... ORDER BY ...) UNION (SELECT ..... ORDER BY ... )

Wir waren beide der Meinung, dass das zusammengesetzte Ergebnis pro Einzelresultset die jeweils gewünschte Sortierung aufweisen würde. Das war aber leider nicht der Fall !

Dabei hatten wir bereits früher ähnliche Statements verwendet, in denen die Sortierung funktionierte! Wir hatten jedoch eine bedeutsame Kleinigkeit übersehen. Unsere früheren Statements waren nämlich von der Art:

( SELECT .... ORDER BY ... LIMIT .. ) UNION (SELECT ..... ORDER BY ... LIMIT .... )

Der Unterschied liegt in der Vorgabe von LIMIT, also der Begrenzung der jeweiligen Teil-Resultsets im UNION-Statement. Wir haben dann ein wenig herumprobiert und herausgefunden, dass eine LIMIT-Vorgabe tatsächlich erforderlich ist, wenn beide (oder mehrere) Resultsets separat sortiert und danach zum Union-Resultset zusammengefügt werden sollen.

Offenbar ignoriert der MySQL-Optimizer die ORDER-Statements der Teil-Selects, wenn die einzelnen Resultsets nicht explizit begrenzt werden.

Somit stehen einem wohl zwei Arten zur Verfügung, wei man ein UNION-Resultset ordnen kann:

  • Variante 1 - separate Sortierung der Einzel-Resultsets :

        ( SELECT .... ORDER BY ... LIMIT ... ) UNION (SELECT ..... ORDER BY ... LIMIT ... )

  • Variante 2 - Sortierung des Gesamt-Resultsets :

        ( SELECT .... ) UNION (SELECT .... ) ORDER BY ....

Hinweise:
Die Klammerung ist mindestens im zweiten Beispiel von ausschlaggebender Bedeutung.
Klar auch, dass dabei die Felder der Einzel-Selects identisch sein sollten.

Links:
In einigen MySQL-Foren findet man tatsächlich auch entsprechende Hinweise. Man sollte da doch öfter mal reinschauen:

http://www.mysqlfaqs.net/mysql-faqs/Funtions-and-Operators/How-does-union-work-in-MySQL
http://forums.mysql.com/read.php?10,412000,412000

Veröffentlicht unter MySQL