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

Lernen in Häppchen

Wichtige Grundregel, wenn man im IT-Bereich erfolgreich sein will: Man hat nie ausgelernt. Es gibt immer neues Wissen, das man lernen sollte. Alles Wissen auf einen Schlag anzusammeln ist gar nicht möglich – außerdem gibt’s dauernd neues. „Informations Technologie“ ist eine junge Wissenschaft und noch ständig in Bewegung.

 Manchmal sind es ganz kleine Informationshäppchen, die man sich aneignen kann.

 In dieser Hinsicht starte ich jetzt eine neue „Reihe“ auf meinem Blog: Lernen in Häppchen.

 Ich stolpere immer wieder über neues Wissen und neue Möglichkeiten, insbesondere im Bereich meiner normalen Tätigkeit mit PHP, MySQL und Apache basierten Webservern. Meist sind es nur ganz kleine Sachen – gar nichts weltbewegendes.

Hier eine neu entdeckte Funktion, da ein Konfigurations-Eintrag.

Für mich sind die jeweils neu. Vieleicht für andere auch…