Dans le langage SQL, la fonction GROUP_CONCAT() permet de regrouper les valeurs non nulles d’un groupe en une chaîne de caractère. Cela est utile pour regrouper des résultats en une seule ligne autant d’avoir autant de ligne qu’il y a de résultat dans ce groupe.
L’intérêt le plus flagrant de cette fonction consiste à concaténer les valeurs d’une colonne correspondant à une jointure avec une autre table. De cette manière, il n’est pas forcément nécessaire d’effectuer un traitement supplémentaire des résultats pour exploiter les valeurs.
Attention : la fonction GROUP_CONCAT() est actuellement disponible que pour MySQL. Les autres Systèmes de Gestion de Base de Données (SGBD) tel que PostgreSQL, SQLite ou SQL Server n’intègrent pas cette fonctionnalité.
Syntaxe
La fonction peut s’utiliser dans une requête SQL telle que celle-ci :
SELECT `id`, GROUP_CONCAT( `nom_colonne` ) FROM `table` GROUP BY `id`
Dans cette requête SQL, les valeurs de la colonne “nom_colonne” seront concaténées et séparée par défaut par une virgule.
Il est possible de choisir le caractère qui sert de séparateur en respectant la syntaxe suivante :
SELECT `id`, GROUP_CONCAT( `nom_colonne` SEPARATOR ' ' ) FROM `table` GROUP BY `id`
Dans cette seconde requête SQL, les valeurs seront séparées par un espace. Il est intéressant de savoir que le séparateur peut être vide pour ne pas mettre de séparateur dans la concaténation.
Exemple
Imaginons un blog qui possède des articles et auxquels il est possible d’associer des mots-clés. Les articles sont enregistrés dans la table “article” ont un titre, une date de création, une date de publication et une catégorie. Les mots-clés sont ajoutés dans une table “mot_cle” et sont associés à chaque article grâce à une clé étrangère (cf. il s’agit d’une “foreign key”).
Table “article” :
id | titre | date_creation | date_publication | categorie |
---|---|---|---|---|
1 | 3 outils informatiques à connaître | 2012-07-11 | 2012-07-18 | information |
2 | Améliorer les performances d'une application web | 2013-04-03 | 2013-04-06 | tutorial |
3 | Protection contre les failles de sécurités | 2013-08-22 | 2013-08-29 | tutorial |
4 | Astuces de codage pour les gros projets | 2013-11-24 | 2013-12-01 | astuces |
5 | Encrypter les données d'une application | 2013-12-02 | 2013-12-04 | astuces |
Table “mot_cle” :
id | article_id | mot | date_creation |
---|---|---|---|
1 | 1 | MySQL | 2012-07-18 |
2 | 1 | PostgreSQL | 2012-07-18 |
3 | 1 | Excel | 2012-07-18 |
4 | 3 | Failles XSS | 2013-08-28 |
5 | 3 | Attaque par force brute | 2013-08-29 |
6 | 4 | Pear | 2013-12-01 |
7 | 4 | Astuce | 2013-12-01 |
Lister les catégories et concaténer les titres
Il est possible de lister toutes les catégories et d’utiliser la fonction GROUP_CONCAT() pour afficher chacun des titres associés à ces catégories, séparés par une virgule. Il est donc possible d’utiliser la requête SQL suivante :
SELECT `categorie`, GROUP_CONCAT(`titre`) AS concat_titre FROM `article` GROUP BY `categorie`
Résultats :
categorie | concat_titre |
---|---|
information | 3 outils informatiques à connaître |
tutorial | Améliorer les performances d'une application web,Protection contre les failles de sécurités |
astuces | Astuces de codage pour les gros projets,Encrypter les données d'une application |
Le résultat de cette requête SQL démontre qu’il est possible d’utiliser la fonction GROUP_CONCAT() pour regrouper dans une seule colonne tous les titres de chacune de ces catégories.
Lister les articles et concaténer les mots-clés
Les articles peuvent être affichés tout en associant la liste des mots-clés de chacun de ces articles. Pour cela, il est possible d’exécuter la requête suivante :
SELECT `titre`, `date_publication`, GROUP_CONCAT(`mot` SEPARATOR " ") AS concat_mot FROM `article` LEFT JOIN `mot_cle` ON `article_id` = `article`.`id` GROUP BY `article`.`id`
Résultats :
titre | date_publication | GROUP_CONCAT(mot) |
---|---|---|
3 outils informatiques à connaître | 2012-07-18 | MySQL PostgreSQL Excel |
Améliorer les performances d'une application web | 2013-04-06 | NULL |
Protection contre les failles de sécurités | 2013-08-29 | Failles XSS Attaque par force brute |
Astuces de codage pour les gros projets | 2013-12-01 | Astuce Pear |
Encrypter les données d'une application | 2013-12-04 | NULL |
Le résultat de cette requête permet d’obtenir en une seule requête les articles et les mots-clés qui sont stockés dans une autre table. Grâce à la modification du séparateur, les mots-clés sont séparés par un espace.
Erreurs courantes
1/ Attention au séparateur
Il convient de bien définir le séparateur et de vérifier que celui-ci ne va pas interférer avec le contenu des colonnes. Par exemple, si le séparateur est une virgule et doit séparer des mots-clés, il convient de s’assurer qu’aucun mot-clé ne contient de virgule. Le cas échéant, il ne sera pas possible de savoir si la virgule est le séparateur ou s’il est inclus dans un mot.
2/ Attention à la limite de longueur
Dans l’hypothèse ou la requête contient de nombreux résultats, il convient de s’assurer que la limite de longueur n’est pas dépassée. Il est possible de redéfinir cette longueur via le paramètre “group_concat_max_len”. Voici une requête pour modifier cette longueur :
SET SESSION group_concat_max_len = 1000000;
3/ Attention au multiple GROUP_CONCAT() dans 1 requête SQL
Il convient de faire attention à des éventuels doublons dans les résultats lorsque plusieurs champs GROUP_CONCAT() existent au sein d’une même requête SQL.