Como usar GROUP_CONCAT em um CONCAT no MySQL

Se eu tiver uma tabela com os seguintes dados no MySQL:

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

como posso obtê-lo no seguinte formato?

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

Eu acho que tenho que usar GROUP_CONCAT . Mas não tenho certeza de como isso funciona.

   
 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; 

Você pode vê-lo implementado aqui: Sql Fiddle Demo . Exatamente o que você precisa.

Atualize a divisão em duas etapas. Primeiro, obtemos uma tabela com todos os valores (separados por vírgula) em relação a um [Nome, id] exclusivo. Então, a partir da tabela obtida, obtemos todos os nomes e valores como um único valor em relação a cada ID exclusivo. Veja isto explicado aqui SQL Fiddle Demo (role para baixo como ele tem dois conjuntos de resultados)

Editar Houve um erro na leitura da questão, eu tinha agrupado apenas por id. Mas dois group_contacts são necessários se (os valores devem ser concatenados agrupados por nome e id e, em seguida, por id por todos). A resposta anterior foi

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

Você pode vê-lo implementado aqui: SQL Fiddle Demo

Experimentar:

 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

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

Primeiro de tudo, eu não vejo a razão para ter um ID que não é único, mas eu acho que é um ID que se conecta a outra tabela. Em segundo lugar, não há necessidade de subconsultas, o que bate o servidor. Você faz isso em uma consulta, como esta

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

Você obtém resultados rápidos e corretos e pode dividir o resultado por esse SEPARATOR “|”. Eu sempre uso este separador, porque é impossível encontrá-lo dentro de uma string, por isso é único. Não há problema em ter dois A’s, você identifica apenas o valor. Ou você pode ter mais uma coluna, com a carta, o que é ainda melhor. Como isso :

 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 

você deve usar converter ou converter, caso contrário, será retornar BLOB

resultado é

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

você tem que lidar com resultado mais uma vez por programa como 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,''),'', ''),'','') from test _a order by 1 desc 

O nome da minha tabela é test e, para concatinação, eu uso a syntax For XML Path (”). A function stuff insere uma string em outra string. Exclui um comprimento especificado de caracteres na primeira cadeia na posição inicial e depois insere a segunda cadeia na primeira cadeia na posição inicial.

As funções do STUFF são assim: STUFF (character_expression, start, length, character_expression)

character_expression É uma expressão de dados de caractere. character_expression pode ser uma constante, variável ou coluna de dados binários ou de caractere.

start É um valor inteiro que especifica o local para iniciar a exclusão e a inserção. Se start ou length for negativo, será retornada uma string nula. Se start for maior que a primeira character_expression, uma string nula será retornada. start pode ser do tipo bigint.

length É um inteiro que especifica o número de caracteres a serem deletados. Se length for maior que a primeira character_expression, a exclusão ocorrerá até o último caractere na última character_expression. comprimento pode ser do tipo bigint.