Mysql bietet dem Anwender die Möglichkeit bei Gruppierungen, Werte anderer Spalten z.B. kommagetrennt in einer Zeile auszugeben.

Die Syntax:

GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr}
                 [ASC | DESC] [,col_name ...]]
             [SEPARATOR str_val])

Wir benutzen das Beispiel, dass wir in dem Artikel zum Verknüpfen von Tabellen beschrieben haben, um Tabellen miteinander zu verknüpfen. Dort haben wir die Tabellen Autor, Buch und eine Verknüpfungstabelle zwischen Autor und Buch. Ein Buch kann mehrere Autoren haben. Wir wollen nun einen SQL-Befehl der alle Bücher ausgibt und deren Autoren in einer Zeile, jeweils mit Komma voneinander getrennt, wenn ein Buch mehrere Autoren hat.

Somit ergibt sich folgender Select:

select b.titel as Titel, group_concat(distinct a.name order by a.name asc separator ‚, ‚) as Autoren from autor a join autor_buch ab on a.id = ab.autor_id join buch b on (ab.buch_id = b.id) group by b.id;

Wir joinen die Tabellen zuerst. Anschließend benutzen wir die Funktion group_concat. Wir wollen jeden Autor nur einmal angezeigt haben, falls der Autor mehrfach zu diesem Buch verlinkt ist, daher das distinct in der Funktion. Ausgeben wollen wir den Autorennamen, alphabetisch sortiert. Zum Abschluß geben wir an, wie die einzelnen Autoren voneinander getrennt sein sollen, dies geschieht mit separator. In diesem Fall das Komma.

Als Ergebnis erhalten wir dann diese Tabelle:

Titel Autoren
Buch 1 Autor 1, Autor 3
Buch 2 Autor 1
Buch 3 Autor 3
Buch 4 Autor 4

Weiteres Beispiel:

SELECT student_name, GROUP_CONCAT(test_score) FROM student GROUP BY student_name;

Zu beachten ist, dass Mysql die Länge der group_concat-Spalte auf eine Länge von 1024 Zeichen begrenzt. Soll diese Spalte jedoch mehr Zeilen enthalten, so muss in der mysql.conf die Systemvariable group_concat_max_len auf einen größeren Wert gesetzt werden und anschließend der Mysql-Server neu gestartet werden, damit die Änderung wirksam wird.

 Antworten

   
Impressum Suffusion theme by Sayontan Sinha