# mySQL " MAX (timestamp)" innerhalb einer Tabelle nur auf bestimmte Sätze beziehe



## FlorianM (9. Juli 2012)

Hallo zusammen,
ich habe folgende Tabellen:


Artikel
Verlauf
id artikelnr name  
 
id artikel_id t_stamp preis


In Verlauf sollen z.B. Preis- und Mengenänderungen gespeichert werden. Jetzt möchte ich immer die aktuellen Preise der Artikel ausgeben und frage daher ein INNER JOIN zwischen Artikel und Verlauf ab:

SELECT  artikel.id , artikel.name , artikel.artikelnr , verlauf.preis

			FROM artikel
			INNER JOIN verlauf
			ON artikel.id = verlauf.artikel_id
			WHERE verlauf.t_stamp = ( SELECT max(t_stamp) FROM verlauf)"

Mein Problem ist nun, dass bei dieser Abfrage nur der eine Artikel ausgegeben wird der den absolut höchsten Timestamp hat. Wie muss ich die WHERE-Clause formulieren, dass mySQL immer den höchsten Timestamp zu jeder Artikel_id (verlauf.artikel_id) heraus gibt?


----------



## Yaslaw (9. Juli 2012)

Ich hatte mal ein Tutorial dazu geschrieben.
MySQL Aktuelle Einträge pro Gruppe auslesen
Du kannst alles obere Quelle einfach dann Artikel anstelle von Verlauf nehmen


----------



## FlorianM (9. Juli 2012)

Hallo Yaslaw,
ich danke dir für deine Antwort. Habe mich in "GROUP BY" eingelesen. Das beantwortet
viele meiner Fragen.
Hier ein Super Tut. zu "GROUP BY": http://www.sql-und-xml.de/sql-tutorial/group-by-zum-aggregieren-auswerten-von-daten.html


----------



## FlorianM (9. Juli 2012)

Ich habe doch ncoh eine Frage:

Habe mein Statement folgend umgebaut und bekomme die Meldung: 

#1054 - Unknown column 'a.id' in 'on clause'


```
SELECT a.*,v.*, le.*
FROM artikel AS a , verlauf AS v

INNER JOIN (
SELECT artikel_id , menge, MAX(t_stamp) AS max_datum , ek, vk, mwst
FROM verlauf
GROUP BY artikel_id
) AS le
ON a.id  = le.artikel_id
AND v.t_stamp = max_datum
```

Die Spalte "id" in der Tabelle "Artikel" ist definitiv vorhanden. Kann mir nicht erklären wie die Meldung zusatnde kommt


----------



## Yaslaw (9. Juli 2012)

*item: *Dein inneres SELECT ist sehr unschön. Was genau willst du da ermitteln?

```
SELECT 
	artikel_id, 
	menge, 
	MAX(t_stamp) AS max_datum , 
	ek, 
	vk, 
	mwst
FROM
	verlauf
GROUP BY
	artikel_id
```
SQL weiss nicht was es mit den Feldern 'menge, ek, vk, mwst' beim Gruppieren machen soll. MySQL ist blöd genug selber annahmen zu treffen - in deinem Fall leider, denn wenn eine Fehlermeldung kommen würde, würdest du da selber sehen was lost ist. MySQL gruppiert automatisch nach allen Feldern die nicht mit Gruppierungsfunktionen behandelt werden. Ergo macht MySQL das folgende draus (und beim Feld menge ist das fast sicher falsch!)

```
SELECT 
	artikel_id, 
	menge, 
	MAX(t_stamp) AS max_datum , 
	ek, 
	vk, 
	mwst
FROM
	verlauf
GROUP BY
	artikel_id, 
	menge, 
	ek, 
	vk, 
	mwst
```

*item: *Sind die Tabellen verlauf und artikel bewusst nicht verknüpft?
Das ganze müsste mMn etwa so aussehen
¨
	
	
	



```
SELECT
	a.*,
	v.*
FROM
	artikel a
	INNER JOIN verlauf v
		ON a.id = v.artikel_id
	INNER JOIN (
			SELECT
				artikel_id,
				MAX(t_stamp) AS max_datum
			FROM
				verlauf
			GROUP BY
				artikel_id
		) AS akt_v
		ON v.artikel_id = akt_v.artikel_id
		AND v.t_stamp = akt_v.max_datum
```


----------



## FlorianM (9. Juli 2012)

Ok, hab dein Statement mal in die Konsole geschmissen und ****t!

Ich dachte ich müsste alle Spalten aus "Verlauf", die mit in die Ergebnistabelle sollen, angeben.
Den Rest muss ich noch weiter studieren, aber danke erstmal.


----------

