448 votes

Comment utiliser GROUP BY pour concaténer des chaînes de caractères dans MySQL ?

En fait, la question est de savoir comment s'en sortir :

foo\_id   foo\_name
1        A
1        B
2        C

à ça :

foo\_id   foo\_name
1        A B
2        C

3 votes

@barlop a réparé ça en éditant les questions et les réponses.

665voto

Scott Noyes Points 1596
SELECT id, GROUP_CONCAT(name SEPARATOR ' ') FROM table GROUP BY id;

https://dev.mysql.com/doc/refman/8.0/en/aggregate-functions.html#function_group-concat

Du lien ci-dessus, GROUP_CONCAT : Cette fonction renvoie un résultat de type chaîne de caractères avec les valeurs non NULL concaténées d'un groupe. Elle renvoie NULL s'il n'y a pas de valeurs non NULL.

171voto

Graeme Perrow Points 22249
SELECT id, GROUP_CONCAT( string SEPARATOR ' ') FROM table GROUP BY id

Plus de détails aquí .

Du lien ci-dessus, GROUP_CONCAT : Cette fonction renvoie un résultat de type chaîne de caractères avec les valeurs non NULL concaténées d'un groupe. Elle renvoie NULL s'il n'y a pas de valeurs non NULL.

0 votes

La colonne résultante a un limite en caractères. Voir aquí et les docs :)

23voto

Exundoz Points 51
SELECT id, GROUP_CONCAT(name SEPARATOR ' ') FROM table GROUP BY id;

:- Dans MySQL, vous pouvez obtenir les valeurs concaténées des combinaisons d'expressions . Pour éliminer les valeurs dupliquées, utilisez la fonction DISTINCT clause. Pour trier les valeurs dans le résultat, utilisez la clause ORDER BY. Pour trier dans ordre inverse , ajoutez le DESC (descendant) au nom de la colonne sur laquelle vous effectuez le tri dans la clause ORDER BY. L'ordre par défaut est l'ordre ascendant ; il peut être spécifié explicitement à l'aide du mot-clé ASC. Le séparateur par défaut entre les valeurs d'un groupe est la virgule (","). Pour spécifier un séparateur de manière explicite, utilisez SEPARATOR suivi de la valeur littérale de la chaîne qui doit être insérée entre les valeurs du groupe. Pour éliminer complètement le séparateur, spécifiez SÉPARATEUR '' .

GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr}
                 [ASC | DESC] [,col_name ...]]
             [SEPARATOR str_val])

OU

mysql> SELECT student_name,
    ->     GROUP_CONCAT(DISTINCT test_score
    ->               ORDER BY test_score DESC SEPARATOR ' ')
    ->     FROM student
    ->     GROUP BY student_name;

21voto

Waqar Alamgir Points 3222

Le résultat est tronqué à la longueur maximale donnée par la variable système group_concat_max_len, dont la valeur par défaut est de 1024 caractères, ce que nous faisons d'abord :

SET group_concat_max_len=100000000;

et ensuite, par exemple :

SELECT pub_id,GROUP_CONCAT(cate_id SEPARATOR ' ') FROM book_mast GROUP BY pub_id

1 votes

Le résultat est tronqué à la longueur maximale donnée par la variable système group_concat_max_len, qui a une valeur de 1 à 2. valeur par défaut de 1024 des personnages. docs

0 votes

Quelle est la portée de ce group_concat_max_len config ? La connexion/session en cours, ou cela affectera-t-il d'autres clients ?

0 votes

@FrozenFlame : > Si aucun modificateur n'est présent, SET modifie la variable de session. Si la variable n'a pas de valeur de session, une erreur se produit. À partir de dev.mysql.com/doc/refman/5.7/fr/utilisation-du-système-variables.html

20voto

Wayne Points 12304
SELECT id, GROUP_CONCAT(CAST(name as CHAR)) FROM table GROUP BY id

Vous obtiendrez une chaîne de caractères délimitée par des virgules.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X