dedlfix: MySQL Datenbank, Order by, was wird sortiert?

Beitrag lesen

Tach!

set @aktmonat = '';
select if(monat = @aktmonat ,'  "  ', @aktmonat := monat)) as monatsname, beschreibung
from termine order by monat;
Ich bin mir hier nicht sicher, ob die Query so schon sicher ist.

Das dürfte sie nicht sein.

Ich vermute, dass man der mit einem unbedingten Subselect arbeiten muss, das nach Monaten sortiert wird und das dann erst an das Select mit der Bedingung übergeben darf.

Ich vermute, dass das nicht zielführend ist.

SELECT * FROM (SELECT * FROM test ORDER BY spalte) t2

Die Ausgabe war jedenfalls nicht nach spalte sortiert. Ohne die äußere Query war sie das aber.

Das ist hier jetzt zwar kein gefährlicher Fall von Reihenfolgemissachtung, aber der Ordnung halber wolle ich das mal in den Raum stellen!
Sortiert wird i.d.R. das _Abfrageergebnis_ und nicht die abzufragende Menge.

Richtig. Und zwar auch erst nachdem die SELECT-Klausel berechnet wurde, denn man bezieht sich ja beim OEDER BY auf einen (Alias-)Namen oder eine Spaltennummer der SELECT-Klausel. Zum Sortieren danach muss der Ausdruck bereits berechnet sein. (Fürs Verständnis: Die SELECT-Klausel ist nur der erste Teil des SELECT-Statements, bis ausschließlich zum FROM.)

Weiterhin stehen im Kapitel zu den User-Defined Variables einige weitere Fallstricke. Das muss man erstmal gründlich testen, ob ein solches Statement das gewünschte Ergebnis bringt - und dnan ist es noch nicht mal garantiert.

Das Handbuch schweigt sich auch darüber aus, ob IF() nach dem Kurzschlussverfahren arbeitet oder nicht. IF() müsste dazu anders als Funktionen im Allgemeinen arbeiten, denn normalerweise werden zuerst die Argumente berechnet und übergeben, und dann die Funktion ausgeführt, dass sie daraus ein Ergebnis erzeugen kann. @aktmonat := monat ist ja kein Lambda-Ausdruck, der erst vom Inneren der Funktion ausgeführt wird. Das ist aber von dir beabsichtigt.

dedlfix.