SQL GROUP_CONCAT()

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 » :

idtitredate_creationdate_publicationcategorie
13 outils informatiques à connaître2012-07-112012-07-18information
2Améliorer les performances d'une application web2013-04-032013-04-06tutorial
3Protection contre les failles de sécurités2013-08-222013-08-29tutorial
4Astuces de codage pour les gros projets2013-11-242013-12-01astuces
5Encrypter les données d'une application2013-12-022013-12-04astuces

Table « mot_cle » :

idarticle_idmotdate_creation
11MySQL2012-07-18
21PostgreSQL2012-07-18
31Excel2012-07-18
43Failles XSS2013-08-28
53Attaque par force brute2013-08-29
64Pear2013-12-01
74Astuce2013-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 :

[table “138” could not be loaded /]

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 :

[table “137” could not be loaded /]

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.

Partager