web-dev-qa-db-fra.com

Comment utiliser GROUP_CONCAT dans un CONCAT dans 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 l'obtenir 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 sais pas comment ça marche.

96
Biswa
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 implémenté ici: Sql Fiddle Demo . Exactement ce dont vous avez besoin.

Mise à jour Fractionnement en deux étapes. Nous obtenons d’abord une table contenant toutes les valeurs (séparées par des virgules) par rapport à un [nom, id] unique. Ensuite, à partir de la table obtenue, nous obtenons tous les noms et toutes les valeurs sous la forme d'une valeur unique pour chaque identifiant unique. Voir l'explication ci-dessous. SQL Fiddle Démo (faites défiler vers le bas car il a deux jeux de résultats)

Modifier Il y avait une erreur dans la lecture de la question, je n'avais groupé que par id. Mais deux group_contacts sont nécessaires si (Les valeurs doivent être concaténées groupées par Nom et id et ensuite par tout 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 implémenté ici: SQL Fiddle Demo

137
Sami

Essayer:

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;

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

21
eisberg
SELECT ID, GROUP_CONCAT(CONCAT_WS(':', NAME, VALUE) SEPARATOR ',') AS Result 
FROM test GROUP BY ID
8
John

Tout d'abord, je ne vois pas pourquoi un identifiant n'est pas unique, mais j'imagine que c'est un identifiant qui se connecte à une autre table. Deuxièmement, les sous-requêtes ne sont pas nécessaires, ce qui bat le serveur. Vous faites cela dans une 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 SEPARATEUR "|". J'utilise toujours ce séparateur, car il est impossible de le trouver à l'intérieur d'une chaîne, il est donc unique. Il n'y a aucun problème à avoir deux A, vous identifiez uniquement la valeur. Ou vous pouvez avoir une autre colonne, avec la lettre, ce qui est encore mieux. Comme ça :

SELECT id,GROUP_CONCAT(DISTINCT(name)), GROUP_CONCAT(value SEPARATOR "|") FROM sample GROUP BY name
4
Lucian Minea
 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 convertir, sinon vous retournerez BLOB

le résultat est

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

vous devez gérer le résultat une nouvelle fois par programme tel que python ou Java

2
lglcomcn

IF OBJECT_ID('master..test') is not null Drop table test

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 distinct NAME , LIST = Replace(Replace(Stuff((select ',', +Value from test where name = _a.name for xml path('')), 1,1,''),'<Value>', ''),'</Value>','') from test _a order by 1 desc

Mon nom de table est test et, pour la concatination, j'utilise la syntaxe For XML Path (''). La fonction stuff insère une chaîne dans une autre chaîne. Il supprime une longueur spécifiée de caractères dans la première chaîne à la position de départ, puis insère la deuxième chaîne dans la première chaîne à la position de départ.

Les fonctions STUFF ressemblent à ceci: STUFF (expression_caractère, début, longueur, expression_caractère)

character_expression Est une expression de données de caractère. character_expression peut être une constante, une variable ou une colonne de caractères ou de données binaires.

start Est une valeur entière qui spécifie l'emplacement de démarrage de la suppression et de l'insertion. Si start ou length est négatif, une chaîne null est renvoyée. Si start est plus long que la première expression character_expression, une chaîne null est renvoyée. start peut être de type bigint.

longueur Est un nombre entier spécifiant le nombre de caractères à supprimer. Si la longueur est supérieure à la première expression_caractère, la suppression se produit jusqu'au dernier caractère de la dernière expression_caractère. la longueur peut être de type bigint.

0
Novy