GROUP_CONCAT()

Als Programmierer lernt man nie aus… Es gibt immer noch die eine Funktion, die das Arbeiten einfacher macht…

Heute bin ich über die Funktion GROUP_CONCAT() in MySQL gestolpert.

Eine ganz einfache Funktion – an sich wenig beeindruckend und alles andere als komplex. Nur: Ich hab sie bisher noch nicht gekannt. Im „allgemeinen SQL“ existiert sie nicht, und auch bei Microsoft Transact-SQL konnte ich kein Äquivalent finden. Ich dachte mir immer „Wäre schön, wenn so was existieren würde“ – aber nachgeschaut habe ich nie…

Was tut sie?

Wenn man einen SQL-Query mit einem GROUP BY einsetzt, dann kann man mit GROUP_CONCAT() alle Strings einer Spalte einfach konkatinieren, also hintereinander hängen. Auf Wunsch mit Trennzeichen.

Nehmen wir einfach mal an, wir haben eine Tabelle mit Blog-Einträgen und eine weitere Tabelle, in der die ganzen Tags zu diesen Blogeinträgen stehen – ein Tag pro Datensatz:

Blog_Posts:

Post_ID Title
1 Wetter
2 Leben
3 Sex
4 Weltfrieden
Blog_Tags:

Post_ID Tag
1 sonne
1 wolken
3 oben ohne
3 frau

Jetzt wollen wir die Blogbeiträge incl. allen Tags auslesen. Wir haben drei Möglichkeiten:

  • Wir lesen erst Blog_Posts und machen dann einen weiteren SELECT auf Blog_Tags – einen für jeden Blog-Eintrag. Dadurch fragen wir die beiden Tabellen oben nacheinander ab, erhalten also zwei Result-Sets, die wir mittels Programm zusammenführen müssen.
  • Wir lassen SQL einen JOIN auf beide Tabellen ausführen und sortieren dann mittels Programm die Daten aus. Als Ergebnis bekommen wir beispielsweise…
    SELECT P.Post_ID, P.Title, P.Tag
    FROM Blog_Posts P
    JOIN Blog_Tags T ON P.Post_ID = T.Post_ID
    WHERE P.Post_ID = 1
    Post_ID Title Tag
    1 Wetter sonne
    1 Wetter wolken

    Wir müssen also auswerten, dass die beiden Zeilen zusammengehören und nur deshalb so erscheinen, weil mehrere Tags vorliegen.

  • Wir setzen GROUP_CONCAT() ein, und lassen MySQL die Arbeit übernehmen.
    SELECT P.Post_ID, P.Title,
           GROUP_CONCAT(T.Tag SEPARATOR ', ') AS Tags
    FROM Blog_Posts P
    JOIN Blog_Tags T ON P.Post_ID = T.Post_ID
    WHERE P.Post_ID = 1
    GROUP BY P.Post_ID, P.Title
    Post_ID Title Tags
    1 Wetter sonne, wolken