Vinzenz Mai: MySQL-Abfrage

Beitrag lesen

Hallo Olli,

Das Ziel ist folgendes:

Tabelle 1: Vorträge

warum nennst Du diese mit dem zwingend zu quotenden Namen

#__aeb_program

Tabelle 2: Referenten

für diese gilt das gleiche.

#__aeb_referee

Ergebnismenge: Alle Vorträge einmalig in der Liste, verknüpft mit einer beliebigen Anzahl Referenten.

In der Vortragstabelle steh im Feld Referenten z.B. "12;5;87"

wie Dir schon gesagt wurde, ist das eine denkbar schlechte Idee. Diesen schlimmen Fehler solltest Du unbedingt beheben. Er führt zuerst zu schrecklichen SQL-Verrenkungen und dann zu noch schrecklicher Performance.

SELECT p.*, CONCAT_WS(';','r.vorname','r.name') AS ref_name FROM #__aeb_program AS p LEFT JOIN #__aeb_referee AS r ON FIND_IN_SET( 'r.id', REPLACE( p.referee, ';', ',' ) ) > 0

Dadurch erhalte ich jedoch nur den ersten Referenten, nicht alle.

Dadurch erhalte ich niemals den ersten Referenten. Ein paar Fehler hat Chris bereits aufgezeigt. Ich sehe weder eine Gruppierung noch eine Aggregatsfunktion, die Einträge einer Gruppe zusammenfassen soll.

Wie könntest Du an Deine Referentenliste kommen?
Im ersten Schritt ermittelst Du alle Referenten-IDs. Dazu kannst Du die Geschichte mit FIND_IN_SET und REPLACE verwenden :-(

Ich habe noch ein paar fehlerhaft eingesetzte einfache Anführungszeichen entfernt. Wenn Du fragst, was da fehlerhaft war, dann lege ich Dir den Handbuchabschnitt "Schema Object Names" ans Herz:

SELECT  
    p.name,  
    CONCAT_WS(', ', r.vorname, r.name) ref_name  
FROM  
    `#__aeb_program` p  
LEFT JOIN  
    `#__aeb_referee` r  
ON  
    FIND_IN_SET(r.id, REPLACE( p.referee, ';', ',' ))

liefert Dir eine Liste der (hoffentlich eindeutigen) Vortragsnamen und der zugehörigen Referenten. Im nächsten Schritt gruppierst Du nach dem Vortragsnamen (besser nach dem Primärschlüssel der Vortragstabelle) und wendest auf die Referenten die Aggregatsfunktion GROUP_CONCAT mit dem von Dir gewünschten Trennzeichen an.

Ach ja: schön ist das nicht. Bitte korrigiere das kaputte Tabellendesign.

Freundliche Grüße

Vinzenz