Maximalwert aus Joined Tabelle zusammenzählen - Aber wie nur?

RadioLechtal

Grünschnabel
Hallo an alle DB-Cracks

Ich brauch da mal dringlich Hilfe.

Ich habe eine Tabelle dort sind Veranstaltungen:

id, Name, Info

und eine Tabelle wo alle Termine dieser veranstaltung drinn sind:

id vid start ende

Eine Veranstaltung kann mehrere Termine haben und start ist timestamp wo es anfängt an einem Tag und ende is wo die Veranstalltung vorbei ist.

Nun will ich mit einer SQL abfrage Die Anzahl der Der Veranstaltungen filtern, wo der letzte Termin abgelaufen ist, also den höchsten Wert in der Reihe ende für diese Veranstaltung hat:

Dann soll eine Zahl rauskommen die sagt zB bei 3 Veranstaltungen sind schon alle Termine in der Verangenheit

ich habe folgende SQL gemacht die dann aber den Fehler wiedergibt :

Invalid use of group function

PHP:
$sqlbefehl= "SELECT Count(s.id) as total FROM $tab_event s 
			LEFT JOIN $tab_termin t on t.vid=s.id
			WHERE  MAX(t.ende) < '".time()."'
			GROUP BY s.id;";
			
                        $getevent  = mysql_query($sqlbefehl, $serverid);
			echo mysql_error();	
			$eintraege = mysql_fetch_array($getevent);
echo "Bei ".$eintraege[total]." Veranstaltungen sind alle Termine abgelaufen";
Hoffe ich habe das richtig ausgedrückt

Was ist da falsch ich steh voll am Schlauch!! :confused:
Danke für jeden Hinweis

Gruß: Andy
 
Hallo RadioLechtal

Die GROUP BY - Anweisung am Schluss braucht es vermutlich gar nicht mehr, du fasst die Einträge ja schon mit dem Count zusammen, drum die Fehlermeldung.
Dafür würd ich sagen, dass es nach dem WHERE eine Subquery braucht, so in etwa:

WHERE (SELECT MAX(ende) FROM $tab_Termin) < '".time()."'

Grüsse, tecla
 
Oder wohl besser:

WHERE t.ende = (SELECT MAX(ende) FROM $tab_Termin)
AND t.ende < '".time()."'
 
Ne das gibt jede Menge anderer Fehler aus - Ich bekomms nit hin so - Jetzt bin ich etwas frustelig LOL - Sitz schomn den ganzen tag an nur einer SQL abfrage und bekomms nit in Griff

Habs mit having probiert:
PHP:
SELECT Count(*) as total FROM $tab_events 
 LEFT JOIN $tab_termin t on t.sid=s.sid 
WHERE s.status='geplant' AND s.rid=$user[id] 
having MAX(t.ende)<".time().";

aber das bringt auch nix .. weder fehler noch Ergebnisse
 
Hallo,

war doch schon fast richtig. Damit das MAX() auch richig funktioniert, musst du auf der Termin-Tabelle über die Veranstaltungen gruppieren und dann darauf die Gruppenfunktion MAX() anwenden (so ähnlich wie in deinem 1.Post):

So holst du dir die Veranstaltungen und Details selbst:

SQL:
select v.name,
       v.info,
       t.vid,
       MAX(t.end)
  from veranstaltungen v
 inner join termine t on v.id = t.vid
 group by t.vid
having MAX(end)<curdate()

und so evtl. darüber die Gesamtanzahl an Veranstaltungen:

SQL:
select count(id) as Anzahl_Veranstaltungen_Mit_Alten_Terminen 
  from (
  select v.id, 
     MAX(t.end) 
    from veranstaltungen v
   inner join termine t on v.id = t.vid
   group by t.vid
  having MAX(end)<curdate()
) as gesamt


Hoffe es hilft,

Markus
 
Hallo Markus!

Danke für Deine Antwot

also ich hab das so gemacht:

PHP:
$sqlbefehl2 = "select count(id) as Anzahl_Veranstaltungen_Mit_Alten_Terminen 
  		from  (
			select v.id, 
			MAX(t.end) 
			from $tab_veranstaltungen v
			inner join termine t on v.id = t.vid
   			group by t.vid
  			having MAX(ende)<".time()."
			) as gesamt"; 
						 
			$getschulung2  = mysql_query($sqlbefehl2, $serverid);

und bekomme folgende Fehlermeldung:

You have an error in your SQL syntax near 'select v.id, MAX(t.end) from argo_veranstaltung v ' at line 3
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in

Scheint so nicht zu klappen:
Übrigens ist das mySQL Server Version: 3.23.56

Was muß ich da ändern?
 
Sodale!

Ein langer ätzender Tag neigt sich dem Ende zu und ich habe eine Lösung herraus gearbeitet, die nun die richtigen Ergebnisse liefert:

PHP:
								$jetzt=time();

								$sqlbefehl = "select *
										from $tab_event v
										left join $tab_termin t on v.id = t.vid
   										WHERE s.status='geplant'"; 
										 
								$getschulung  = mysql_query($sqlbefehl, $serverid);
								$countover=0;
								While ($eintraege = mysql_fetch_array($getschulung)){
									$sqlcount="SELECT MAX(ende) as maxende FROM $tab_termin WHERE vid=$eintraege[vid]";
									$get  = mysql_query($sqlcount, $serverid);
									echo mysql_error();	
									$ein = mysql_fetch_array($get);

									if ($eintraege[ende]<$jetzt && $eintraege[ende]==$ein[maxende]) $countover = $countover+1;
								}

Anders hab ich es nicht hingebracht - Danke für eure Antworten und Hilfen. Falls einer wwas eleganteres hat...

danke und Grüße: Andy (jetzt glücklich)
 
Hallo,

ja bei MySQL 3.23 kannst du keine Subquery benutzen. Dennoch sollte das Gruppieren funktionieren. Ich hab jetzt leider keine 3.23 hier laufen zum Testen, aber wenn es dir wirklich nur um die Anzahl geht, probier mal meine 1.Query und dann mach im PHP folgendes:

PHP:
$sqltext = " <mein erstes SQL-Statement>";
$result = mysql_query($sqltext);
$anz_veraltete_veranst = mysql_num_rows($result);

Nun steht in $anz_veraltete_veranst die Anzahl der Veranstaltungen, die nur Termine in der Vergangenheit haben.

Probier das SQL-Statement einfach mal direkt aus. Wenn es in MySQL 3.23 funktioniert, dann bau dein PHP mal einfach so um wie oben gezeigt. Lass die Datenbank ruhig für dich arbeiten. Ansonsten sag nochmal Bescheid, dann passen wir das Statement nochmal an.

Markus
 
Zurück