SQL: GROUP_CONCAT(), auch im UPDATE mit JOIN
Autor: Carsten Parschat, Varsamis Karamanidis (Macky), Ralf v.d.Mark
eingetragen: Dienstag, 31. Januar 2006 um 10:33 Uhr (5/2006 Kalenderwoche)
geändert: Dienstag, 02. Dezember 2025 um 12:29 Uhr (49/2025 Kalenderwoche)
Keywords: gruppe aggregat concat sammeln group Update Join
Kategorien: DB: MySQL, DB: MariaDB,
Text:
GROUP_CONCAT() fügt die Inhalte (string) von gruppierten DB-Feldern zu einem kommagetrennten string zusammen.
Im Update-SQL am Ende sieht man ein Update mit einer guppierten SubQuery, um die durch eine Kreuztabelle verknüpften Begriffe in ein Textfeld zu scheiben.
UPDATE vom 05.09.2012 (Tipp von Macky)
Standardmäßige Max-Länge: 1024 Zeichen.
Mit folgendem Befehl kann man das ändern:
SET SESSION group_concat_max_len = 1500000;
s. auch Artikel "UPDATE mit JOIN"
Quellcode:
-- In ORACLE:
SELECT col1,
LISTAGG(col2, ',') WITHIN GROUP (ORDER BY col2) AS concatenated_values
FROM my_table
GROUP BY col1;
-- LISTAGG(col2, ','): Verbindet die Werte von col2 mit Komma als Trennzeichen.
-- WITHIN GROUP (ORDER BY col2): Bestimmt die Reihenfolge der Werte innerhalb der Liste.
-- GROUP BY col1: Gruppiert die Ergebnisse wie gewohnt.
-------------------------------------------------------
-- In MariaDB/MySQL:
SET SESSION group_concat_max_len = 1500000;
SELECT prjekte.name,
GROUP_CONCAT(DISTINCT abteilung.name
ORDER BY abteilung.id
SEPARATOR ",")
FROM projekte, abteilung, verknuepfung_projekte_abteilung
WHERE projekte.id = verknuepfung_projekte_abteilung.projekte_id
AND verknuepfung_projekte_abteilung.abteilung_id = abteilung.id
GROUP BY projekte.id
ORDER BY projekte.id
________________________________________
UPDATE vom 05.09.2012 (Tipp von Macky):
mysqli_query($db_link, 'SET SESSION group_concat_max_len= 150000')
or die('Fehler: Erhoehung-*group_concat_max_len* MySQL-Error: '
.mysqli_errno().': '.mysqli_error());
________________________________________
-- Ralf: Begriffe in ein Text-Feld schreiben:
UPDATE seminar SET
fachgebiete = CONCAT("ERLEDIGT! - ",
(SELECT GROUP_CONCAT(DISTINCT `fachg_txt`
SEPARATOR "; ") AS fachgTxts
FROM `fachgebiete_verkn`
JOIN `fachgebiete` ON (`fachg_id` = `fachg_id_fk`)
WHERE `seminar_id_fk` = 66
GROUP BY `seminar_id_fk`))
WHERE seminar_id = 66;
________________________________________
-- Ralf: Update mit JOIN anderer Tabellen, verändert nur ungleiche Werte
UPDATE db.tabelle01 a
INNER JOIN db.tabelle02 b ON (b.land_id = a.land_id)
SET a.land_text = b.land_text
WHERE a.land_text NOT LIKE BINARY b.land_text;
________________________________________
-- Ralf: Update mit JOIN anderer Tabellen
UPDATE db.tabelle01 tab01
INNER JOIN db.tabelle02 tab02 ON (tab01.id = tab02.id)
INNER JOIN db.tabelle03 tab03 ON (tab02.einrichtg_id = tab03.id)
SET tab01.benutzername = CONCAT(SUBSTRING(tab01.benutzername,
1,
(LENGTH(tab01.benutzername) - 3)),
tab03.akronym)
WHERE tab01.anwdg_id = 2
AND tab01.archiv = 0
AND tab02.archiv = 0
AND tab03.archiv = 0
AND tab03.id IN (6009,6010,6011,6012,6018,6043);