Juil
9

MySQL : la fonction GROUP_CONCAT()

Author Nico    Category SQL     Tags , ,

La fonction GROUP_CONCAT() de MySQL permet de concaténer les résultats d’un groupe.

Par exemple, si on veut récupérer les ID des utilisateurs pour les mettre dans un tableau:
avec une requête classique :

SELECT ID FROM utilisateur;

On devra ensuite parcourir les résultats un par un pour les ajouter au tableau (avec mysql_fetch… en PHP)

avec GROUP_CONCAT() :

SELECT GROUP_CONCAT(CAST(ID AS CHAR)) FROM utilisateur;

Au lieu d’avoir autant de lignes de résultat que l’on a trouvé d’utilisateurs, on n’aura ici qu’une seule ligne de résultats. Les ID seront séparés par des virgules. On se passe ainsi d’une boucle, puisqu’on sait qu’on a un résultat unique. On peut ensuite éclater la chaîne pour en faire un tableau (fonction explode() en PHP).

Quelques remarques :

  • On remarque la présence de la fonction CAST(… AS CHAR) dans l’exemple ci-dessus. Comme le résultat de la requête est une chaîne (valeurs séparées par des virgules), les valeurs à grouper doivent être converties en CHAR. On doit donc utiliser CAST() dès lors qu’on ne groupe pas des valeurs de type chaîne.
  • ATTENTION : GROUP_CONCAT() tronque le nombre de résultats d’après la valeur d’une constante MySQL (group_concat_max_len, par défaut fixée à 1024 bits). Il convient d’augmenter cette valeur (globalement avec GLOBAL ou seulement pour la session avec SESSION) de la manière suivante :
    SET SESSION group_concat_max_len = 1000000

Pour la documentation officielle, voir le site de MySQL.

Cet article vous a-t-il été utile ? N’hésitez pas à laisser un commentaire ci dessous.



1 Comment to “MySQL : la fonction GROUP_CONCAT()”

  • Roland 9 octobre 2012 à 11 h 03 min

    Merci pour l’astuce de group_concat_max_len que je ne connaissais pas.
    En revanche, vous ne parlez pas du SEPARATOR, DISTINCT etc. que l’on peut appliquer dans GROUP_CONCAT.
    Exemple : GROUP_CONCAT(DISTINCT nom SEPARATOR « , « ).
    De tête, on peut également trier les résultats (pas très utile pour les id, j’en conviens ^^) et faire d’autres actions, comme un CONCAT :
    GROUP_CONCAT(DISTINCT CONCAT(nom,  » « , prenom) ORDER BY nom ASC, prenom ASC SEPARATOR « , « )

Poster un commentaire

Edito

Bienvenue sur Mémorandom.

Mémorandom est le blog de 2 développeurs web, Appo et Nico.

Vous y trouverez des informations sur différents domaines touchant de près ou de loin au développement web

Tutoriels Yii Framework

Nos derniers articles

Blogs Dev

Liens

Étiquettes