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:
|
Blog_Tags:
|
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