Come concatenare i valori di più righe in un unica colonna in MariaDB-MySQL

02 febbraio 2022

MariaDB e MySQL mediante la funzione GROUP_CONCAT consentono  di concatenare i valori di una medesima colonna da varie righe in un unico campo.
La funzione ha la seguente sintassi:
GROUP_CONCAT(DISTINCT espressione ORDER BY espressione SEPARATOR separatore)
​Supponiamo di avere la seguente tabella:
MariaDB [db]> select * from clienti;
+----+-------+---------+-------------+
| Id | Nome | Cognome | Nazione |
+----+-------+---------+-------------+
| 1 | Mario | Rossi | Italia |
| 2 | Rick | Hope | Inghilterra |
| 3 | Alex | Weber | Germania |
| 4 | Mary | White | Inghilterra |
| 5 | Greta | Schmidt | Germania |
+----+-------+---------+-------------+
5 rows in set (0.001 sec)
Vogliamo ottenere con una query un unico valore contenete le nazioni dei clienti:
MariaDB [db]> select GROUP_CONCAT(Nazione) FROM clienti;
+--------------------------------------------------+
| GROUP_CONCAT(Nazione) |
+--------------------------------------------------+
| Italia,Inghilterra,Germania,Inghilterra,Germania |
+--------------------------------------------------+
1 row in set (0.001 sec)
Per evitare la ripetizione dei nomi dato che più clienti appartengono alla medesima nazione:
MariaDB [db]> select GROUP_CONCAT(DISTINCT Nazione ORDER BY Nazione ASC) FROM clienti;
+-----------------------------------------------------+
| GROUP_CONCAT(DISTINCT Nazione ORDER BY Nazione ASC) |
+-----------------------------------------------------+
| Germania,Inghilterra,Italia |
+-----------------------------------------------------+
1 row in set (0.001 sec)
Se ora vogliamo modificare il separatore di default che è la virgola:
MariaDB [db]> select GROUP_CONCAT(DISTINCT Nazione ORDER BY Nazione ASC SEPARATOR '-') FROM clienti;
+-------------------------------------------------------------------+
| GROUP_CONCAT(DISTINCT Nazione ORDER BY Nazione ASC SEPARATOR '-') |
+-------------------------------------------------------------------+
| Germania-Inghilterra-Italia |
+-------------------------------------------------------------------+
1 row in set (0.001 sec)