130 votes

Comment utiliser GROUP_CONCAT dans un CONCAT en MySQL

Si j'ai une table avec les données suivantes dans MySQL :

id       Name       Value
1          A          4
1          A          5
1          B          8
2          C          9

comment puis-je le mettre dans le format suivant ?

id         Column
1          A:4,5,B:8
2          C:9

Je pense que je dois utiliser GROUP_CONCAT . Mais je ne suis pas sûr de savoir comment cela fonctionne.

175voto

Sami Points 2204
select id, group_concat(`Name` separator ',') as `ColumnName`
from
(
  select 
    id, 
    concat(`Name`, ':', group_concat(`Value` separator ',')) as `Name`
  from mytbl
  group by 
    id, 
    `Name`
) tbl
group by id;

Vous pouvez le voir mis en œuvre ici : Sql Fiddle Demo . Exactement ce dont vous avez besoin.

Mise à jour Fractionnement en deux étapes. D'abord nous obtenons une table ayant toutes les valeurs (séparées par des virgules) contre un unique [Name,id]. Ensuite, à partir de la table obtenue, nous obtenons tous les noms et toutes les valeurs comme une seule valeur pour chaque identifiant unique. Voir l'explication ici Démonstration de SQL Fiddle (faire défiler vers le bas car il y a deux ensembles de résultats)

Modifier Il y a eu une erreur dans la lecture de la question, j'avais regroupé uniquement par id. Mais deux group_contacts sont nécessaires si (les valeurs doivent être concaténées en les groupant par Nom et par Id et ensuite par Id). La réponse précédente était

select 
id,group_concat(concat(`name`,':',`value`) separator ',')
as Result from mytbl group by id

Vous pouvez le voir mis en œuvre ici : Démonstration de SQL Fiddle

23voto

eisberg Points 1632

Essayez :

CREATE TABLE test (
  ID INTEGER,
  NAME VARCHAR (50),
  VALUE INTEGER
);

INSERT INTO test VALUES (1, 'A', 4);
INSERT INTO test VALUES (1, 'A', 5);
INSERT INTO test VALUES (1, 'B', 8);
INSERT INTO test VALUES (2, 'C', 9);

SELECT ID, GROUP_CONCAT(NAME ORDER BY NAME ASC SEPARATOR ',')
FROM (
  SELECT ID, CONCAT(NAME, ':', GROUP_CONCAT(VALUE ORDER BY VALUE ASC SEPARATOR ',')) AS NAME
  FROM test
  GROUP BY ID, NAME
) AS A
GROUP BY ID;

SQL Fiddle : http://sqlfiddle.com/#!2/b5abe/9/0

9voto

John Points 127
SELECT ID, GROUP_CONCAT(CONCAT_WS(':', NAME, VALUE) SEPARATOR ',') AS Result 
FROM test GROUP BY ID

6voto

Lucian Minea Points 135

Tout d'abord, je ne vois pas la raison d'avoir un ID qui n'est pas unique, mais je suppose que c'est un ID qui se connecte à une autre table. Deuxièmement, il n'y a pas besoin de sous-requêtes, qui font chier le serveur. Vous faites tout cela en une seule requête, comme ceci

SELECT id,GROUP_CONCAT(name, ':', value SEPARATOR "|") FROM sample GROUP BY id

Vous obtenez des résultats rapides et corrects, et vous pouvez diviser le résultat par ce SÉPARATEUR "|". J'utilise toujours ce séparateur, car il est impossible de le trouver dans une chaîne de caractères, il est donc unique. Il n'y a aucun problème à avoir deux A, vous identifiez seulement la valeur. Ou vous pouvez avoir une colonne de plus, avec la lettre, ce qui est encore mieux. Comme ceci :

SELECT id,GROUP_CONCAT(DISTINCT(name)), GROUP_CONCAT(value SEPARATOR "|") FROM sample GROUP BY name

5voto

lglcomcn Points 51
 SELECT id, GROUP_CONCAT(CONCAT_WS(':', Name, CAST(Value AS CHAR(7))) SEPARATOR ',') AS result 
    FROM test GROUP BY id

vous devez utiliser cast ou convert, sinon vous retournerez BLOB

Le résultat est

id         Column
1          A:4,A:5,B:8
2          C:9

vous devez traiter le résultat une fois de plus par un programme tel que python ou java

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