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.
Mettez à jour le
fractionnement en deux étapes. Tout d'abord, nous obtenons une table contenant toutes les valeurs (séparées par des virgules) par rapport à un [Name, id] unique. Ensuite, à partir de la table obtenue, nous obtenons tous les noms et valeurs sous forme de valeur unique par rapport à chaque identifiant unique Voir ceci expliqué ici Démo SQL Fiddle (défilement vers le bas comme il a deux ensembles de résultats)
Edit Il y a eu 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, puis 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: Démo SQL Fiddle
GROUP_CONCAT
pourrait tronquer silencieusement sa sortie versgroup_concat_max_len
.SET group_concat_max_len=...
aidera, mais c'est quand même une bonne idée de vérifier que la longueur (octet?) renvoyée est inférieure àgroup_concat_max_len
.Essayer:
SQL Fiddle: http://sqlfiddle.com/#!2/b5abe/9/0
la source
la source
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, ce qui bat le serveur. Vous faites cela en une seule requête, comme ceci
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 dans une chaîne, c'est pourquoi il est unique. Il n'y a aucun problème à avoir deux A, vous n'identifiez que la valeur. Ou vous pouvez avoir une colonne de plus, avec la lettre, ce qui est encore mieux. Comme ça :
la source
vous devez utiliser cast ou convertir, sinon vous retournerez BLOB
le résultat est
vous devez à nouveau gérer le résultat par un programme tel que python ou java
la source
IF OBJECT_ID('master..test') is not null Drop table test
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)
expression_caractère Est une expression de données de caractère. expression_caractère peut être une constante, une variable ou une colonne de données caractères ou binaires.
start Est une valeur entière qui spécifie l'emplacement de démarrage de la suppression et de l'insertion. Si le début ou la longueur est négatif, une chaîne nulle est renvoyée. Si start est plus long que la première expression_caractère, une chaîne nulle est renvoyée. start peut être de type bigint.
length Est un entier qui spécifie le nombre de caractères à supprimer. Si la longueur est plus longue que 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.
la source
SELECT id, Group_concat (
column
) FROM (SELECT id, Concat (name
, ':', Group_concat (value
)) AScolumn
FROM mytbl GROUP BY id, nom) tbl GROUP BY id;la source