SQL: GROUP_CONCAT(), auch im UPDATE mit JOIN

edit | delete

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);