Cómo usar GROUP_CONCAT en un CONCAT en MySQL

Resuelto Biswa asked hace 12 años • 7 respuestas

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.

Biswa avatar Nov 19 '12 17:11 Biswa
Aceptado
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

Sami avatar Nov 19 '2012 10:11 Sami

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

eisberg avatar Nov 19 '2012 10:11 eisberg
SELECT ID, GROUP_CONCAT(CONCAT_WS(':', NAME, VALUE) SEPARATOR ',') AS Result 
FROM test GROUP BY ID
John avatar Dec 22 '2014 13:12 John

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
Lucian Minea avatar Aug 14 '2017 16:08 Lucian Minea