Hallo
Danke Vinzenz für dei ausführliche und nette Antwort, das sieht sehr gut aus, ich werde mich morgen damit beschäftigen
Hättest Du das ganze gern aufsteigend nach dem ersten Datum eines Events sortiert, dann kommst Du um Subselects (Voraussetzung: MySQL 4.1 oder neuer) kaum herum.
Kommt man doch: Normal mit ORDER BY sortieren, das war wohl zu einfach :-)
SELECT
e.name as Event,
GROUP_CONCAT(
DISTINCT l.name -- jede Location nur einmal
ORDER BY l.name -- aufsteigend sortiert
SEPARATOR ', ' -- mit Komma und Leerzeichen getrennt
) AS Locations, -- ein netter Spaltenname
MIN(p.datum) AS Beginn -- erster Tag des Events
FROM tbl_events e
INNER JOIN tbl_programm p
ON e.id = p.event_id
INNER JOIN tbl_locations l
ON p.location_id = l.id
GROUP BY e.name
ORDER BY Beginn -- und nach dem ersten Tag sortieren
und dann nochmal eine Rückmeldung geben. Meine MySQL Version ist 4.0.
Schade, die Doku sagt: GROUP_CONCAT was added in MySQL 4.1 :-(
Mein Vorschlag: Verwende folgendes Statement:
SELECT
e.name as Event,
p.datum,
l.location
FROM tbl_events e
INNER JOIN tbl_programm p
ON e.id = p.event_id
INNER JOIN tbl_locations l
ON p.location_id = l.id
ORDER BY e.name, l.location, p.datum
Durchlaufe die Ergebnismenge mit PHP, führe bei Änderungen von "Event" einen Gruppenwechsel (Stichwort für Archivsuche) durch. Zu jeder Gruppe ermittle über entsprechende Arrays die Liste der Locations (auch hier könntest Du mit Gruppenwechsel arbeiten) und das kleinste Datum (falls überhaupt benötigt).
Ein hübsches Beispiel dafür, was den Unterschied zwischen 4.0.x und 4.1.x betrifft.
Freundliche Grüße
Vinzenz