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 único [Nome, id]. Então, da tabela obtida, obtemos todos os nomes e valores como um único valor em relação a cada id único. Veja isso explicado aqui. SQL Fiddle Demo (role para baixo, pois tem dois conjuntos de resultados)
Editar Ocorreu um erro ao ler a pergunta, agrupei 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, todos por id). A resposta anterior era
select
id,group_concat(concat(`name`,':',`value`) separator ',')
as Result from mytbl group by id
Você pode ver isso implementado aqui: SQL Fiddle Demo
GROUP_CONCAT
pode truncar silenciosamente sua saída paragroup_concat_max_len
.SET group_concat_max_len=...
vai ajudar, mas é uma boa idéia, de qualquer maneira, verificar se o comprimento retornado (byte?) é menor quegroup_concat_max_len
.Experimentar:
SQL Fiddle: http://sqlfiddle.com/#!2/b5abe/9/0
fonte
fonte
Em primeiro lugar, não vejo razão para ter um ID que não seja único, mas acho que é um ID que se conecta a outra tabela. Em segundo lugar, não há necessidade de subconsultas, o que sobrecarrega o servidor. Você faz isso em uma consulta, assim
Você obtém resultados rápidos e corretos e pode dividir o resultado pelo SEPARADOR "|". Sempre utilizo esse separador, pois é 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 pode ficar com mais uma coluna, com a letra, que é ainda melhor. Como isso :
fonte
você deve usar cast ou converter, caso contrário será return BLOB
resultado é
você tem que lidar com o resultado mais uma vez por programa como python ou java
fonte
IF OBJECT_ID('master..test') is not null Drop table test
Meu nome de tabela é teste e, para concatinação, uso a sintaxe For XML Path (''). A função stuff insere uma string em outra string. Ele exclui um comprimento especificado de caracteres na primeira string na posição inicial e, em seguida, insere a segunda string na primeira string na posição inicial.
As funções STUFF têm a seguinte aparência: STUFF (expressão_caractere, início, comprimento, expressão_caractere)
character_expression É uma expressão de dados de caractere. character_expression pode ser uma constante, variável ou coluna de dados de caracteres ou binários.
start É um valor inteiro que especifica o local para iniciar a exclusão e inserção. Se o início ou comprimento for negativo, uma string nula será retornada. Se o início for mais longo do que o primeiro character_expression, uma string nula será retornada. start pode ser do tipo bigint.
comprimento É um número inteiro que especifica o número de caracteres a serem excluídos. Se o comprimento for maior que o primeiro character_expression, a exclusão ocorrerá até o último caractere na última character_expression. comprimento pode ser do tipo bigint.
fonte
SELECT id, Group_concat (
column
) FROM (SELECT id, Concat (name
, ':', Group_concat (value
)) AScolumn
FROM mytbl GROUP BY id, nome) tbl GROUP BY id;fonte