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
Hi,
erst jetzt entdeckt, da erst jetzt gebraucht. Klappt prima, vielen Dank!
Greetz,
bambineo
Geht mir genau so, vielen Dank!
Cool! Wenn es implode() schon nicht gibt, diese Funktion ist genial…
Ey, 3 Stunden gesucht nach dieser Lösung, genau das was ich gebraucht habe… Woher wenn man nicht weiß, dass es diese Funktion gibt?? damn! 🙂
Nach dieser Funktion habe ewig gesucht, fantastisch!
Hallo Ihr IT-Spezialisten,
ich benötige die o.a. Funktion für „open office base“ bzw. in 000 basic.
kann mir da jemand weiterhelfen.
Für Access (VBA) habe ich Sie schon gefunden.