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.
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
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/
SELECT ID, GROUP_CONCAT(CONCAT_WS(':', NAME, VALUE) SEPARATOR ',') AS Result
FROM test GROUP BY ID
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
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
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.