Cómo usar GROUP_CONCAT en un CONCAT en MySQL
Si tengo una tabla con los siguientes datos en MySQL:
id Name Value
1 A 4
1 A 5
1 B 8
2 C 9
¿Cómo lo consigo en el siguiente formato?
id Column
1 A:4,5,B:8
2 C:9
Creo que tengo que usar GROUP_CONCAT
. Pero no estoy seguro de cómo 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;
Puedes verlo implementado aquí: Demostración de Sql Fiddle . Exactamente lo que necesitas.
Explicado mediante división en dos pasos Primero, obtenemos una tabla que tiene todos los valores (separados por comas) frente a un [Nombre,id] único. Luego, de la tabla obtenida obtenemos todos los nombres y valores como un valor único frente a 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, había agrupado solo por identificación. Pero se necesitan dos contactos de grupo si (los valores deben concatenarse agrupados por nombre e identificación y luego, en general, por identificación). La respuesta anterior fue
select
id,group_concat(concat(`name`,':',`value`) separator ',')
as Result from mytbl group by id
Puedes verlo implementado aquí: Demostración de SQL Fiddle
Intentar:
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;
Violín SQL: http://sqlfiddle.com/#!2/b5abe/9/0
SELECT ID, GROUP_CONCAT(CONCAT_WS(':', NAME, VALUE) SEPARATOR ',') AS Result
FROM test GROUP BY ID
En primer lugar, no veo el motivo de 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 perjudica al servidor. Haces esto en una consulta, así
SELECT id,GROUP_CONCAT(name, ':', value SEPARATOR "|") FROM sample GROUP BY id
Obtienes resultados rápidos y correctos, y puedes dividir el resultado por ese SEPARADOR "|". Siempre uso este separador porque es imposible encontrarlo dentro de una cadena, por lo que es único. No hay problema en tener dos A, identificas solo el valor. O puedes tener una columna más, con la letra, que es aún mejor. Como esto :
SELECT id,GROUP_CONCAT(DISTINCT(name)), GROUP_CONCAT(value SEPARATOR "|") FROM sample GROUP BY name