SQL SQL-Abfrage ich bekomme sie nicht hin

P

Put001

Gast
Hi,

ich versuche schon die ganze Zeit eine SQL-Abfrage hunzubekommen. Vielleicht könnt hier ja helfen.

Ich habe ein Tabelle (mehrere zehntausend Einträge) in der Form:

ID, Wert, Datum
11, 2, 12.12.2010
11, 1, 11.12.2010
22, 1, 10.10.2009
22, 7, 11.10.2010

Als Ergebnis soll kommen:

11, 2
22, 7

Also ich benötige immer den Eintrag mit dem jüngsten Datum. Ich bekomme es einfach nicht hin.

Ich hoffe, Ihr könnt helfen.

Vielen Dank.
 
SELECT ID, Wert FROM tabelle ORDER BY Datum ASC LIMIT 1

Weiß nicht welches DBS du benutzt, aber MySQL konnte das LIMIT-Statement zumindest.
 
SELECT *
FROM tabelle
WHERE id=11 AND wert=2
OR id=22 AND wert=7
ORDER BY datum DESC

sollte so eigentlich gehen?...
 
SELECT id, wert
FROM `table` tab1
WHERE datum=(SELECT MAX(tab2.datum)
FROM `table` tab2
WHERE tab1.id = tab2.id);

Ich denke, so in etwa sollte das klappen, zumindest in MySQL
 
Zuletzt bearbeitet:
Wäre schon mal hilfreich, wenn du sagen würdest was für eine SQL Datenbank du da hast, damit man weiß welchen Dialekt man nehmen soll. Dann werden auch die Hinweise besser
 
Ich habe mysql. Es ist nur eine Tabelle mit über 200.000 Einträgen. Weder mit den Group By, noch mit den MAX-Funktionen erhalte ich das gewünschte Ergebnis. ist das gar nicht in einer Abfrage möglich?
 
Also ich habe testhalber dein Beispiel nachgebaut und erhalte mit meiner Abfrage auch genau dein Ergebnis in MySQL...

Hier mal mit Screenshots:

http://www.abload.de/img/bild1kc6e.jpg

http://www.abload.de/img/bild22goh.jpg


Edit: Klappts denn mittlerweile? Du gibst recht wenig Feedback. Was erhältst du denn mit welcher Abfrage für ein Ergebnis? Darauf aufbauend könnten wir dir sicher helfen.
 
Zuletzt bearbeitet:
Wo ist da genau der Primärschlüssel bei deiner Tabelle !? Über diesen ginge es dann immernoch am leichtesten.
Ansonsten siehe Madmans Lösung, aber das mit dem fehlenden Key ist ziemlich schlecht.
 
Zuletzt bearbeitet:
rejoice hat doch eh schon die Lösung gepostet...
 
Es geht doch um das jüngste Datum und nicht um den maximalen Wert von "Wert".
Darum müsste es doch so lauten:

SELECT ID, Wert
FROM was-auch-immer
GROUP BY ID
ORDER by Datum DESC

(Der Order-Klausel müsste man noch die Formatierung des Datums übergeben, sofern die angegebene Formatierung nicht dem Standard entspricht und die Datenbank damit nichts anfangen kann)
 
SELECT id, wert FROM table ORDER BY datum DESC LIMIT 1
 
macht doch distinct... dann hast du keine doppelte Werte -.-

leider kann ich dir nicht sagen, ob dir das hilft, da du eventuell einen anderen Eintrag brauchst. Wenn es vom Datum abhängt, dann tu doch das Datum ja rein in die Where Bedingung!
 
Agratos schrieb:
SELECT id, wert FROM table ORDER BY datum DESC LIMIT 1

LIMIT limitiert die Ergebniszeilen. Das ist aber nicht das, was er haben will. Wenn du dann LIMIT 1 angibst, wird MySQL dir auch nur eine einzige Zeile zurückgeben. Da der TE aber schon zwei Zeilen haben möchte, ist LIMIT nutzlos. Außerdem beherschen nicht alle DB Systeme LIMIT. Bis jetzt ist mir nur MySQL bekannt.

roker002 schrieb:
macht doch distinct... dann hast du keine doppelte Werte -.-

Bei MySQL müsste er dann eine Unterabfrage mit DISTINCT machen, da MySQL DISTINCT anders behandelt als andere DB Systeme, wie z.B. Oracle Database (zumindest ist mir so ein Verhalten unter Oracle Database nicht vorgekommen). MySQL handelt DISTINCT als ein Sonderfall von der ORDER BY- Klausel

SELECT DISTINCT ID, Wert ... wäre in MySQL Äquivalent mit SELECT ID, Wert ... GROUP BY ID, Wert. Das ist aber auch nicht so ganz, was der TE haben möchte.
Unter Oracle Database bezog sich AFAIR das DISTINCT nur auf die erste Spalte, die selektiert wird. Also nur auf das ID und das würde schon eher hinkommen.

Viele Wege führen nach Rom. Daher wäre es schonmal interessant gewesen, welches DB System er verwendet, weil nunmal nicht jeder SQL-Dialekt gleichwertig funktioniert.
 
Zuletzt bearbeitet:
Oh sorry, hab mich verschrieben und verguckt. LIMIT 2 wär die richtige Schreibweise gewesen, aber immernoch nicht das, was der Threadstarter will.
Wie hängen denn die beiden Werte dann zusammen? Immer die doppelte ID vom neusten?
 
Put001 schrieb:
ID, Wert, Datum
11, 2, 12.12.2010
11, 1, 11.12.2010
22, 1, 10.10.2009
22, 7, 11.10.2010

Also ich benötige immer den Eintrag mit dem jüngsten Datum. Ich bekomme es einfach nicht hin.

12.12.2010 ist jünger als 11.12.2010 und
11.10.1010 ist jünger als 10.10.2009
 
Also mit meiner Abfrage erhält er genau das Ergebnis das er gewollt hatte, sucht sich das jüngste Datum der jeweiligen ID und gibt ID und Wert aus. Wenn sich der TE nicht mehr dazu äußert isses halt echt schade um den Aufwand :rolleyes:
 
Vermutlich hat der Thread ersteller bereits eine Lösung gefunden, da er sich nicht meldet, aber fürs Protokoll:

Ja, Madman1209, deine Lösung funktioniert in der Tat.
Nur leider nicht performant für mehrere zehntausend einträge, wir vom threadersteller geschrieben! Je mehr betroffene Zeilen summiert sich dein subselect in der where bedingung ins unermessliche.

Ich hab mal schnell ne test tabelle angelgt und 1800 IDs zu je 3 verschiedenen wert & datums kombinationen erstellt und deinen und meinen query verglichen

Dein Query:
PHP:
SELECT id, wert
FROM `test_a` tab1
WHERE datum=(SELECT MAX(tab2.datum)
FROM `test_a` tab2
WHERE tab1.id = tab2.id);

Meiner (Subselect):
PHP:
select
	b.*
from
	(
	select
		id,
		max(datum) as max_datum
	from
		test_a
	group by
		id
	) a
inner join
	test_a b
	on	b.id = a.id
		and b.datum = a.max_datum

Ich hab bewusst keinerlei Indexes vergeben! Einfach nur so zum testen...

Laufzeit
deiner: 1800 rows in set (16.25 sec)
meiner: 1800 rows in set (1.06 sec)
 
Zurück
Oben