Vinzenz Mai: MySQL: GROUP BY, Aggregatsfunktionen + JOIN

Beitrag lesen

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