SQL SELECT mit GROUP BY und MAX()

M

mw197

Gast
Hallo Leute,

folgende Tabelle habe ich mal erstellt für meine Problembeschreibung:
bild1.PNG

Ich möchte jetzt alle Daten auslesen und dabei per Kunde groupen.
Sprich: Von jedem Kunden brauche ich nur einen Datensatz und das IMMER den neuesten Datensatz! Das hätte ich nun wie folgt gedacht, funktioniert aber nicht:
SQL:
SELECT * FROM `tabelle` WHERE MAX(`datum1`) GROUP BY `kundenID`
da bekomme ich eine Fehlermeldung.

Mit folgendem Code bekomme ich trotzdem den alten Datensatz (ich brauche den vom 10.09.):
SQL:
SELECT * FROM `tabelle` GROUP BY `kundenID` HAVING MAX(`datum1`)

Genauso wenig funktioniert ein ORDER BY
SQL:
SELECT * FROM `tabelle` GROUP BY `kundenID` ORDER BY datum1

Das Ergebnis ist IMMER folgendes:
bild2.PNG

was mache ich falsch? Wieso bekomme ich immer den falschen Datensatz?

Jemand eine Idee?

Danke im Voraus!
 
Nase schrieb:
Code:
SELECT *, MAX(datum1) FROM tabelle1 GROUP BY kundenID


Das fliegt die außer vielleicht bei MySQL und SQLite schön um die Ohren. Alles was im Select steht sollte auch mit ins Group by, außer es steht in einer Aggregatsfunktion. Noch dazu ist das fehlerbehaftet, stell die mal vor als Name steht je KundenId nicht immer das selbe, dann wirft dir MySQL IMHO einen zufälligen Namen aus, richtig nett zu debuggen.

Ich würde da machen:
Code:
SELECT tbl2.* FROM
(SELECT kundenID, MAX(datum) AS maxdatum FROM tabelle GROUP BY kundenID) tbl
LEFT JOIN tabelle tbl2 ON tbl.maxdatum=tbl2.datum AND tbl.kundenID = tbl2.kundenID
Sprich ein Subselect nach maximalem Datum und KundenId und da dann die restlichen Daten drauf gejoined.
Habe ich jetzt nicht getestet, aber sollte so ähnlich funktionieren. Optional könnte man zusätzlich max(id) abholen und da draufjoinen, dann würde man bei mehereren Einträgen je Kunde und Datum nur einen Datensatz mit der höchsten ID zurückbekommen.
Ergänzung ()

Madman1209 schrieb:
und die hat keinen Text?

Braucht man den bei einem Konstrukt wie WHERE MAX(`datum1`)? Wüsste nicht wie das gehen sollte :D
 
Hi,

@mambokurt

mir ging es in erster Linie darum, den TE zu selbstständigem Denken zu erziehen. Zu sagen "da kommt ein Fehler" und dann die Fehlermeldung entweder nicht lesen oder posten ist vollkommen sinnfrei.

Ebenso sinnfrei finde ich dem TE eine perfekte Lösung direkt zu liefern - viel zielführender wäre es, ihm Schritt für Schritt die Fehler aufzuzeigen, damit er es künftig gleich sauber und richtig macht :)

give a man a fish and you feed him for a day; teach a man to fish and you feed him for a lifetime

Jetzt aber eh schon zu spät... in diesem Sinne!

VG,
Mad
 
Madman1209 schrieb:
Hi,

@mambokurt

mir ging es in erster Linie darum, den TE zu selbstständigem Denken zu erziehen. Zu sagen "da kommt ein Fehler" und dann die Fehlermeldung entweder nicht lesen oder posten ist vollkommen sinnfrei.

Akzeptiere ich vollkommen wenn die Fehlermeldung zielführend ist. SQL hat leider die Tendenz zu sagen 'Mag nicht', solche Fehlermeldungen kann man nur mit etwas Wissen/Erfahrung abfangen.

Madman1209 schrieb:
Hi,
Ebenso sinnfrei finde ich dem TE eine perfekte Lösung direkt zu liefern - viel zielführender wäre es, ihm Schritt für Schritt die Fehler aufzuzeigen, damit er es künftig gleich sauber und richtig macht :)

Ich gehe davon aus, dass das auch anderen hilft(Madman hat zB gelernt, dass alles was im Select steht auch ins Group By gehört, außer es steht in einer Aggregatsfunktion, ich hoffe er handelt zukünftig danach und betrachtet das Verhalten von MySQL als Geschenk, dass man mit Vorsicht behandeln muss) ;) Selbst wenn nicht: ich würde jetzt niemandem seine Hausaufgaben lösen, aber manchmal steht man halt auf dem Schlauch oder unter Zeitdruck und braucht eine Lösung. Ich persönlich würde hier nur Fragen posten wenn es wirklich brennt...
 
@mambokurt: Nein, das habe ich jetzt nicht von dir gelernt, weil ich das schon wusste ;). Mein Ansatz war allerdings genauso geartet wie der Ansatz von Madman1209 und sollte nicht die fertige Lösung präsentieren, sondern weitere Fragen provozieren.
 
Nase schrieb:
@mambokurt: Nein, das habe ich jetzt nicht von dir gelernt, weil ich das schon wusste ;). Mein Ansatz war allerdings genauso geartet wie der Ansatz von Madman1209 und sollte nicht die fertige Lösung präsentieren, sondern weitere Fragen provozieren.

Was provoziert das denn für Fragen? Du hast eine fertige Lösung hingeschrieben, die unter MySQL auch weder Warnung noch Fehler wirft, als ergebnisorientierter Mensch gibts da copy+paste und dann wird nie wieder drauf geguckt. In einam Jahr dann fällt auf einmal auf, dass da Namen zufällig rauskommen und dann ist das große debuggen angesagt...

Nichts für ungut, aber wenn das provozieren von Fragen deine Absicht war hast du das auf die verschwurbelste mögliche Art gemacht :D
 
Zurück
Oben