Sven Rautenberg: Aggregatsfunktionen, group by, unvorhersagbare Ergebnisse

Beitrag lesen

Moin!

Nein, mit dem GROUP BY.

Hallo Sven,

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.

Es gibt keinen Wert, der nicht gruppiert wird. Alle Werte werden gruppiert, wie sollte das sonst anders gehen.

Zu den Spalten kann ich nur sagen, dass bis auf den Preis und das Datum des Preises alle Werte einer ProduktID gleich sind.

Dann verleihe dieser Tatsache Nachdruck, indem du sämtliche dieser Spalten in dein GROUP BY schreibst.

Das heisst bei Übergabe einer ProduktID variieren einzig und alleine die Preise und deren jeweiliges Erstellungsdatum.

Das bedeutet, dass du für Preis und Datum eine Aggregatfunktion finden mußt, die dir "den aktuellsten Preis" und "das aktuellste Datum" liefert.

Problem: Aggregatfunktionen arbeiten nur auf ihrer eigenen Spalte. Und es gibt keine Funktion "das aktuellste".

Beim Datum helfen zum Glück numerische Vergleiche, du kriegst also mit MAX(datum) das "größte" Datum, was gleichzeitig das aktuellste Datum ist.

Aber du kriegst parallel nicht mit MAX(preis) den aktuellsten Preis, sondern den größten. Und es gibt keine Aggregatfunktion, die dir den Preis liefert aus der Zeile, die MAX(datum) hat.

Für dein Problem ist "Gruppierung" einfach der falsche Ansatz. Du kannst das, was du von der Datenbank wissen willst, nicht mit einer schlichten Gruppierung auslesen! Punkt, aus, Ende!

Und jetzt kommt dein Problem: Du benutzt MySQL 4.0. Damit kannst du auch keine Unterabfragen machen.

Denn im Prinzip mußt du deine Abfrage wie folgt aufbauen:

Unterabfrage: Gruppiere zu jeder Artikel-ID das MAX(datum).
Hauptabfrage: Gib mir den langen JOIN, bei dem die Artikel-ID gleich der Artikel-ID aus der Unterabfrage ist, und das Datum gleich dem MAX(datum) aus der Unterabfrage.

Problem ist, dass ich nicht das letzte Datum erhalte sondern ein beliebiges.

Wie gesagt, das versuchen wir dir hier im Thread schon seit Anbeginn zu vermitteln:

Im SQL-Standard müssen alle Spalten, die als Ergebnis einer GROUP BY-Abfrage auftauchen sollen, entweder durch eine Aggregatfunktion gebildet werden, oder hinter GROUP BY aufgeführt werden.

MySQL erlaubt, auch andere Spalten in das Ergebnis mit aufzunehmen, aber wenn der Spalteninhalt nicht genau wie die Hauptgruppierungsspalte in allen Einzelzeilen gleich ist, wird ein ZUFÄLLIGER Datensatz in das Ergebnis übernommen!

Mit der Aggregatfunktion bestimmst du stattdessen, welcher Datensatz in das Ergebnis kommen soll: Das Maximum, das Minimum, die Summe, die Anzahl,...

Es gibt aber leider keine Aggregatfunktion "das Neueste", weil "Neuheit" sich eben durch "ich habe die größte Sekundenzahl seit 1970" definiert - aber dein Preis keine Sekundenzahl ist, und in seinem Feld auch kein Eintragunsdatum dabei steht, und es keine NEWEST()-Aggregatfunktion gibt, die du nutzen kannst.

Es ist also immer noch die Frage offen, warum ich trotz ORDER BY nicht an das richtige Ergebniss gelange.

Dazu hast du schon dreimal eine Antwort erhalten - aber verstanden offenbar nicht.

- Sven Rautenberg

--
"Love your nation - respect the others."