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;
Puedes verlo implementado aquí: Sql Fiddle Demo . Exactamente lo que necesitas.
Actualice
Splitting en dos pasos. Primero obtenemos una tabla que tiene todos los valores (separados por comas) contra un [Nombre, id] único. Luego, de la tabla obtenida, obtenemos todos los nombres y valores como un valor único contra cada identificación única. Vea esto explicado aquí. Demostración de SQL Fiddle (desplácese hacia abajo ya que tiene dos conjuntos de resultados)
Editar Hubo un error al leer la pregunta, lo había agrupado solo por id. Pero se necesitan dos group_contacts si (los valores deben concatenarse agrupados por nombre e id y luego sobre todos por id). La respuesta anterior fue
select
id,group_concat(concat(`name`,':',`value`) separator ',')
as Result from mytbl group by id
Puedes verlo implementado aquí: SQL Fiddle Demo
GROUP_CONCAT
puede truncar silenciosamente su salida agroup_concat_max_len
.SET group_concat_max_len=...
ayudará, pero de todos modos es una buena idea comprobar que la longitud devuelta (¿bytes?) es menor quegroup_concat_max_len
.Tratar:
Violín SQL: http://sqlfiddle.com/#!2/b5abe/9/0
fuente
fuente
En primer lugar, no veo la razón para tener una identificación que no sea única, pero supongo que es una identificación que se conecta a otra tabla. En segundo lugar, no hay necesidad de subconsultas, lo que supera al servidor. Haces esto en una consulta, como esta
Obtiene resultados rápidos y correctos, y puede dividir el resultado por ese SEPARADOR "|". Siempre uso este separador, porque es imposible encontrarlo dentro de una cadena, por eso es único. No hay problema en tener dos A, solo identificas el valor. O puede tener una columna más, con la letra, que es aún mejor. Me gusta esto :
fuente
debe usar cast o convertir, de lo contrario se devolverá BLOB
el resultado es
tienes que manejar el resultado una vez más por un programa como Python o Java
fuente
IF OBJECT_ID('master..test') is not null Drop table test
El nombre de mi tabla es prueba, y para la concatenación utilizo la sintaxis For XML Path (''). La función de cosas inserta una cadena en otra cadena. Elimina una longitud especificada de caracteres en la primera cadena en la posición inicial y luego inserta la segunda cadena en la primera cadena en la posición inicial.
Las funciones STUFF se ven así: STUFF (character_expression, start, length, character_expression)
character_expression Es una expresión de datos de caracteres. character_expression puede ser una constante, variable o columna de caracteres o datos binarios.
inicio Es un valor entero que especifica la ubicación para iniciar la eliminación y la inserción. Si el inicio o la longitud son negativos, se devuelve una cadena nula. Si start es más largo que el primer character_expression, se devuelve una cadena nula. start puede ser de tipo bigint.
longitud Es un número entero que especifica el número de caracteres que se eliminarán. Si la longitud es mayor que la primera expresión_caracteres, la eliminación se produce hasta el último carácter de la última expresión_caracteres. la longitud puede ser de tipo bigint.
fuente
SELECT id, Group_concat (
column
) FROM (SELECT id, Concat (name
, ':', Group_concat (value
)) AScolumn
FROM mytbl GROUP BY id, nombre) tbl GROUP BY id;fuente