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 |