with group_concat ejemplos array mysql concat group-concat

ejemplos - Cómo usar GROUP_CONCAT en un CONCAT en MySQL



mysql group_concat separator (6)

En primer lugar, no veo el motivo para tener una identificación que no sea única, pero supongo que es una identificación que se conecta a otra mesa. En segundo lugar, no hay necesidad de subconsultas, lo que acelera el servidor. Haz esto en una consulta, como esta

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

Obtiene resultados rápidos y correctos, y puede dividir el resultado por ese SEPARADOR "|". Siempre utilizo este separador, porque es imposible encontrarlo dentro de una cuerda, por lo que es único. No hay problema con tener dos A, solo identifica el valor. O puede tener una columna más, con la letra, que es aún mejor. Me gusta esto :

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

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 obtengo 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.


Tratar:

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


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,''''),''<Value>'', ''''),''</Value>'','''') from test _a order by 1 desc

Mi nombre de tabla es prueba, y para concatinación uso la sintaxis For XML Path (''''). La función de cosas inserta una cadena en otra cuerda. 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 de inicio.

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 cualquier carácter o datos binarios.

start Es un valor entero que especifica la ubicación para iniciar la eliminación y la inserción. Si el inicio o la longitud es negativo, 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.

length Es un número entero que especifica el número de caracteres para eliminar. Si la longitud es más larga que la primera character_expression, la eliminación se produce hasta el último carácter en la última character_expression. la longitud puede ser de tipo bigint.


SELECT id, GROUP_CONCAT(CONCAT_WS('':'', Name, CAST(Value AS CHAR(7))) SEPARATOR '','') AS result FROM test GROUP BY id

debe usar conversión o conversión, de lo contrario será devuelto BLOB

resultado es

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

tienes que manejar el resultado una vez más por un programa como python o java


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


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;

Puede verlo implementado aquí: Sql Fiddle Demo . Exactamente lo que necesitas

Actualizar la división en dos pasos. Primero obtenemos una tabla con 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 solo valor para cada ID único. Vea esto explicado aquí SQL Fiddle Demo (desplácese hacia abajo, ya que tiene dos conjuntos de resultados)

Editar Hubo un error al leer la pregunta, solo lo había agrupado por id. Pero se necesitan dos grupos_contactos si (los valores se concatenarán agrupados por Nombre e ID y luego por ID). La respuesta anterior fue

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

Puede verlo implementado aquí: SQL Fiddle Demo