Vinzenz Mai: Aggregatsfunktionen, group by, unvorhersagbare Ergebnisse

Beitrag lesen

Hallo Sebastian,

zum einen habe ich den Join überarbeitet, damit wenigstens da kein(weniger?) Fehler mehr auftreten, zum anderen habe ich keine Probleme mit dem Ergebniss von MIN(). Das heißt die Ergebnisse des GROUP BY sind wie vorher gesehen richtig. Das Problem entsteht bei dem Wert der nicht gegroupt wird.

Nein. Das Problem ist in MySQL enthalten. Jedes andere mir bekannte Datenbankmanagementsystem weist Deine Abfrage als syntaktisch falsch zurück, was ich persönlich gut finde. MySQL ist großzügig, ist schlampig. Das ändert nichts daran, dass das, was MySQL zurückliefert dem entspricht, was das Handbuch verspricht, ich zitiere aus dem entsprechenden Abschnitt:

<zitat>
Do not use this feature if the columns you omit from the GROUP BY part are not constant in the group. The server is free to return any value from the group, so the results are indeterminate unless all values are the same.
</zitat>

Das Resultat dieser nicht gruppierten Spalte ist unbestimmt. Der Server darf jeden beliebigen Wert aus der Gruppe zurückliefern. Du sollst dieses Feature _nicht_ nutzen, wenn die Werte in dieser Spalte je Gruppe _nicht_ gleich sind.

Problem ist, dass ich nicht das letzte Datum erhalte sondern ein beliebiges. Es ist also immer noch die Frage offen, warum ich trotz ORDER BY nicht an das richtige Ergebniss gelange.

Weil es keinen Grund dafür gibt. Ich hoffe, Du kannst meine Argumentation nachvollziehen. ORDER BY sortiert die Datensätze des Ergebnisses, nicht die der Ausgangsmengen. Und selbst wenn es die Ausgangsdaten sortierte, garantiert Dir MySQL _immer noch nicht_, dass es den "ersten" Wert einer nicht aggregierten Spalte nimmt. MySQL nimmt einen zufälligen.

So langsam bin ich mit meinem SQL-Latein am Ende.

Dein Problem ist mit SQL wunderbar einfach zu lösen. Es ist eine Standardaufgabe, für die es eine Standardlösung gibt: korrelierte Subselects, siehe auch im MySQL-Handbuch.

Der einzige klitzekleine aber leider entscheidende Haken an der Sache ist der, dass MySQL Subselects erst ab Version 4.1 unterstützt, Du aber Version 4.0.24 im Einsatz hast. Im MySQL-Handbuch der älteren Versionen findest Du auch einen sehr schmutzigen Workaround, wie man das mit MySQL 4.0.x und älter in einem einzigen Statement hinbekommt: MAX-CONCAT trick.

Freundliche Grüße

Vinzenz