Forum: PC-Programmierung MYSQL-Query (GROUP BY, ORDER.)


von Fabian H. (hdr)


Lesenswert?

Ich habe grad ein Brett vor'm Kopf... Wie kann ich möglichst elegent 
folgendes Problem formulieren (vereinfacht):

Tabelle:

ID       NameID        Datum
=====================================
1        1             2009-09-16 00:00:01
2        1             2009-09-16 00:00:02
3        1             2009-09-16 00:00:03
4        2             2009-09-16 00:00:04
5        2             2009-09-16 00:00:05

6        1             2009-09-17 00:00:01
7        1             2009-09-17 00:00:02

8        1             2009-09-18 00:00:01
9        1             2009-09-18 00:00:02
10       2             2009-09-18 00:00:03
11       3             2009-09-18 00:00:04
12       3             2009-09-18 00:00:05


Als Ergebnis meiner Abfrage möchte ich folgendes bekommen:
ID       NameID        Datum
===============================================
9        1             2009-09-18 00:00:01
10       2             2009-09-18 00:00:03
12       3             2009-09-18 00:00:05


Mein Versuch (vereinfacht) war folgender:

SELECT `ID`, `NameID`, `Datum` FROM `Tabelle` WHERE `Datum` LIKE 
'2009-09-18 %' AND ORDER BY `Datum` DESC GROUP BY `NameID`

Das ganze funktioniert aber leider nicht, da man erst nach dem 
Gruppieren sortieren kann. Drehe ich das um, so erhalte ich nicht den 
"spätesten" Eintrag am Tag pro Person, sondern den Ersten.

Sollte man das ganze mit einem verschachtelten SELECT lösen oder gibt es 
eine einfachere Variante?

von (prx) A. K. (prx)


Lesenswert?

Probier's mal so:
SELECT max(`ID`), `NameID`, max(`Datum`) FROM `Tabelle` WHERE `Datum` 
LIKE '2009-09-18 %' GROUP BY `NameID` order by 3
wobei dabei max(id) aber nicht zwingend zu max(datum) passt.

von Fabian H. (hdr)


Lesenswert?

Danke, funktioniert leider nicht, da die Tabelle in Wirklichkeit noch 
mehr Spalten hat, dessen Zuordnung dann verloren gehen. Außerdem liefert 
mir dann die Ausgabe nur eine Zeile.

von Dr. G. Reed (Gast)


Lesenswert?

sowas ähnliches hab ich heut in Oracle gemacht, falls MySQL auch sowas 
wie dir Analytical Functions wie Oracle hat, versuch mal sowas:

http://sql-plsql-de.blogspot.com/2008/05/den-jngsten-datensatz-selektieren-mit.html

von Dr. G. Reed (Gast)


Lesenswert?

in den Kommentaren ist dort auch eine nicht so oracle-spezifische Lösung 
zu finden

von Fabian H. (hdr)


Lesenswert?

Danke, ich habe es jetzt so gelöst:

SELECT * FROM (SELECT ID, NameID, Datum FROM Tabelle WHERE Datum LIKE 
'2009-09-16%' ORDER BY Datum DESC) as virtual_table GROUP BY NameID

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.