[MySQL] mehrer Tabellen. Aus einer nur den Max-Wert nehmen

Steusi

Nasenbär
Hallo Leute ich habe gerade ein Verständnisproblem, hoffe jemand kann mir helfen.
Es sieht folgendermaßen aus:
Tabellen:

Toner:
Code:
idToner 	Bezeichnung
126		TN2
127		TN3
128		TN6
Toner_bestand:
Code:
idToner_bestand 	Datum 		Anzahl 	idStandort 	idToner
7			2009-08-25	8	2		95
2			2009-07-31	1	2		97
6			2009-08-25	5	2		97
Toner_mindestbestand
Code:
idToner	idStandort 	Menge 
51		2		3
55		2		3
Standort:
Code:
idStandort 	Bezeichnung 
1		NAME1
2		NAME2

Meine Abfrage über die Tabellen sieht folgendermaßen aus:
PHP:
string(266) "SELECT * 
FROM toner, toner_mindestbestand, toner_bestand, standort 
WHERE (toner.idtoner = toner_bestand.idtoner) 
and (toner.idtoner = toner_mindestbestand.idtoner) 
and (toner_bestand.idStandort = standort.idStandort) 
ORDER BY standort.Bezeichnung, toner.Bezeichnung"

Das funktioniert auch wunderbar. Nur leider habe ich in meiner Tabelle "Toner_bestand" gleiche Toner, ich bräuchte von dieser Tabelle aber nur den Wert vom letzten Datum.
Sprich eine MAX-Abfrage auf das Datum, aber für jede idToner.

Wie bekomme ich diese "2" Abfragen verknüpft, dass jeder Tonername (von idToner) nur einmal vorkommt?
Meine jetzige Ausgabe:
Code:
Standort	toner-Name	Soll	Bestand
Name		TN3		3	2
Name		TN2		3	5
Name		TN2		3	1
(die Zeile:
Code:
Name		TN2		3	5
ist veraltet und soll nicht mit aufgelistet werden)

Kann ich von meinen bisherigen Ergebnissen, einfach noch die Datumsangabe mit einbeziehen und dann nur den MAX auf das Datum machen aber in Abhängigkeit von dem toner-Namen?


Ich hoffe jemand versteht mein Problem und kann mir einen Lösungsvorschlag zeigen.
Schon mal vielen Dank im Voraus!
 
Zuletzt bearbeitet:
Hi.

Du müßtest über Toner_bestand.idToner gruppieren und dort das maximale Datum ermitteln.

Das ganze kannst du dann in einem Sub-Select mit den anderen Tabellen verwenden. Oder du erstellst dir eine View.

SQL:
select * from
  toner,
  toner_mindestbestand,
  (select * from Toner_bestand 
     group by idToner
     having datum = max(datum)) as bestand ...
Gruß
 
Eine Verschachtelung der SELECT-Angaben bei FROM ist gültig, dessen war ich mir nicht bewusst.
Jedoch funktioniert es leider nicht, :-(

Ich habe folgende Abfrage:
PHP:
string(342) "SELECT * 
FROM toner, toner_mindestbestand, 
(SELECT * FROM 
toner_bestand 
GROUP BY idToner 
HAVING Datum = max(Datum)) AS BestandDatum, 
standort 
WHERE (toner.idtoner = toner_bestand.idtoner) 
and (toner.idtoner = toner_mindestbestand.idtoner) 
and (toner_bestand.idStandort = standort.idStandort) 
ORDER BY standort.Bezeichnung, toner.Bezeichnung"
Fehler:
1064 --> You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '), standort WHERE (toner.idtoner = toner_bestand.idtoner) and (toner.idtoner = ' at line 1
Leider sehe ich den Fehler nicht...
 
Zuletzt bearbeitet:
Ich habe folgende Abfrage:
PHP:
string(342) "SELECT * 
FROM toner, toner_mindestbestand, 
(SELECT * FROM 
toner_bestand 
GROUP BY idToner 
HAVING Datum = max(Datum)) AS BestandDatum, 
standort 
WHERE (toner.idtoner = toner_bestand.idtoner) 
and (toner.idtoner = toner_mindestbestand.idtoner) 
and (toner_bestand.idStandort = standort.idStandort) 
ORDER BY standort.Bezeichnung, toner.Bezeichnung"
Es gibt keine Tabelle Toner_bestand in der übergeordneten SELECT Anweisung; es muss BestandDatum heißen.

Gruß
 
Ich verstehe, wunderbar jetzt bekomme ich keine Fehlermeldung mehr. Aber der gewünschte Effekt tritt nicht auf.
Sobald ein Toner (also idToner) mehrfach in der Datenbank ist, wird er nicht ausgegeben!!

Kann man wirklich so einfach Datum = max(Datum) schreiben, bei einer WHERE-Bedingung würde es ja auch nicht klappen. :(

Leider habe ich keine Fehlermeldung ....

Folgenden Code habe ich auch mal ausprobiert, doch leider wird mir dann alles X mal ausgespuckt :(

PHP:
SELECT * FROM 
toner, toner_mindestbestand, standort, toner_bestand 
WHERE (toner.idtoner = toner.idtoner) 
and (toner.idtoner = toner_mindestbestand.idtoner) 
and (toner_bestand.idStandort = standort.idStandort) 
and Datum IN 
     (SELECT MAX(datum) 
     FROM toner_bestand 
     GROUP BY idtoner) 
ORDER BY standort.Bezeichnung, toner.Bezeichnung"

Folgendes klappte auch nicht:
http://www.tutorials.de/forum/relationale-datenbanksysteme/302078-select-max-datum-und-group.html
 
Zuletzt bearbeitet:
Sobald ein Toner (also idToner) mehrfach in der Datenbank ist, wird er nicht ausgegeben!!
Da MySQL einige Dinge anders macht als "normale" DBMS, war ich der Meinung das würde bei MySQL so funktionieren.

Dann z.B. so (funktioniert auch bei anderen DBMS):
SQL:
select * from toner_bestand as tb1 
  where datum = ( select max(datum) from toner_bestand
    where idToner = tb1.idToner )
Gruß
 
Zurück