c21: PHP-Kalender: MySQL-Abfrage mit GROUP_CONCAT und UNION

Beitrag lesen

Hallo,

ich möchte eine PHP-Kalender mit Termindaten aus einer MySQL-Datenbank (MySQL 5) befüllen.

Wenn eine Termin noch frei ist (ubf_status = 'N'), soll es einen Link zum Buchungsformular geben.
Wenn eine Termin bereits gebucht ist (ubf_status = 'Y'), soll 'gebucht' hinter der Uhrzeit stehen.
Diese Formatierungen füge ich bereits in der SQL-Abfrage ein (GROUP_CONCAT), da die Einträge pro Kalendertag über
   setCalendarText( &$days, ...)
festgelegt werden.

Wenn es mehrere Termine pro Tag gibt, hab ich jedoch eine Problem.

Beispiel:
2013-07-17 09:00 gebucht
2013-07-17 15:00 gebucht

2013-07-26 10:00 gebucht
2013-07-26 15:00 frei

2013-07-31 10:00 frei
2013-07-31 12:00 frei

Haben beide Termine den selben Status (2013-07-17 und 2013-07-31), passt die Ausgabe.
Sind sie jedoch unterschiedlich (2013-07-26), wird nur ein Eintrag ausgegeben (da sie nicht im selben array stehen).

Wie kann ich meine SQL-Abfrage (eigentlich 2 Abfragen - je nach Termin-Status - mit UNION verknüpft), sodass alle Termine eines Tages im selben array landen, unabhängig vom Termin-Status.
Kann man da nochmals eine GROUP_CONCAT über beide Abfragen machen?

Im Screenshot sieht man die Kalenderbefüllung und die Ausgabe der array-Daten.

Und hier der Quellcode:

-- snip --

// Abfrage  
$anfrage_ubf="( SELECT  
ubf_id,  
ubf_termin_datum,  
ubf_termin_uhrzeit,  
substring(ubf_termin_datum, 1, 4) as ubf_termin_datum_jahr,  
substring(ubf_termin_datum, 6, 2) as ubf_termin_datum_monat,  
substring(ubf_termin_datum, 9, 2) as ubf_termin_datum_tag,  
ubf_status,  
GROUP_CONCAT( '<a href=\"fuehrungen-termin-buchen.php?ubf_id=',ubf_id,'\">',substring(ubf_termin_uhrzeit, 1, 5),' Uhr</a>' ORDER BY ubf_termin_datum ASC, ubf_termin_uhrzeit ASC SEPARATOR '<br />') AS Termin  
FROM ubf  
WHERE ubf_termin_datum >= '$heute'  
AND ubf_typ = 'F'  
AND ubf_status = 'N'  
GROUP BY ubf_termin_datum )  
  
UNION ALL  
  
( SELECT  
ubf_id,  
ubf_termin_datum,  
ubf_termin_uhrzeit,  
substring(ubf_termin_datum, 1, 4) as ubf_termin_datum_jahr,  
substring(ubf_termin_datum, 6, 2) as ubf_termin_datum_monat,  
substring(ubf_termin_datum, 9, 2) as ubf_termin_datum_tag,  
ubf_status,  
GROUP_CONCAT( '<i>',substring(ubf_termin_uhrzeit, 1, 5),' Uhr gebucht</i>' ORDER BY ubf_termin_datum ASC, ubf_termin_uhrzeit ASC SEPARATOR '<br />') AS Termin  
FROM ubf  
WHERE ubf_termin_datum >= '$heute'  
AND ubf_typ = 'F'  
AND ubf_status = 'Y'  
GROUP BY ubf_termin_datum )  
  
ORDER BY ubf_termin_datum ASC, ubf_termin_uhrzeit ASC";  
$ergebnis_ubf = @mysql_query($anfrage_ubf)  
or die("<div class=\"error\">Fehler bei der Datenbankabfrage!</div>");  
  
$anzahl_ubf = @mysql_num_rows($ergebnis_ubf);  
  
$list = array();  
while ($row = mysql_fetch_assoc($ergebnis_ubf)) {  
   $list[] = $row;  
}  
  
foreach ($list as $i => $record) {  
// zur Kontrolle: Auflistung der Daten des arrays  
   echo $i, ". ", $record['ubf_termin_datum_jahr'], "-", $record['ubf_termin_datum_monat'], "-", $record['ubf_termin_datum_tag'], " - ", $record['Termin'], "<br />\n";  
// befuellt den jeweiligen Kalendertag  
   setCalendarText( &$days, $record['ubf_termin_datum_monat'], $record['ubf_termin_datum_tag'], $record['ubf_termin_datum_jahr'], "".$record[Termin]."" );  
}

-- snap --

Danke im Voraus.
Christian.