postgres group_concat ejemplos mysql sql group-concat

group_concat - ¿Cómo crear formato json con group-concat mysql?



mysql group_concat separator (5)

¿Cómo crear formato json con group-concat mysql?

(Yo uso MySQL)

Ejemplo 1:

tabla 1:

email | name | phone ------------------------------------- [email protected] | Ben | 6555333 [email protected] | Tom | 2322452 [email protected] | Dan | 8768768 [email protected] | Joi | 3434356

Como código de sintaxis que no me da el formato:

select email, group-concat(name,phone) as list from table1 group by email

salida que necesito:

email | list ------------------------------------------------ [email protected] | {name:"Ben",phone:"6555333"},{name:"Joi",phone:"3434356"} [email protected] | {name:"Tom",phone:"2322452"},{name:"Dan",phone:"8768768"}

Gracias


Con las versiones más recientes de MySQL, puede usar la función JSON_OBJECT para lograr el resultado deseado, así:

GROUP_CONCAT( JSON_OBJECT( ''name'', name, ''phone'', phone ) ) AS list

Para preparar la respuesta SQL para analizarla como una matriz:

SELECT email, CONCAT( ''['', COALESCE( GROUP_CONCAT( CONCAT( ''{'', ''/"name/": /"'', HEX(name), ''/", '', ''/"phone/": /"'', HEX(phone), ''/"'', ''}'') ORDER BY name ASC SEPARATOR '',''), ''''), '']'') AS bData FROM table GROUP BY email

Esto le dará una cadena como: [{name: ''ABC'', phone: ''111''}, {name: ''DEF'', phone: ''222''}] que puede ser analizado por JSON. Espero que esto ayude.


Intente esta consulta

SELECT email, GROUP_CONCAT(CONCAT(''{name:"'', name, ''", phone:"'',phone,''"}'')) list FROM table1 GROUP BY email;

Resultado del formato JSON -

+---------------+-------------------------------------------------------------+ | email | list | +---------------+-------------------------------------------------------------+ | [email protected] | {name:"Ben", phone:"6555333"},{name:"Joi", phone:"3434356"} | | [email protected] | {name:"Tom", phone:"2322452"},{name:"Dan", phone:"8768768"} | +---------------+-------------------------------------------------------------+


La respuesta de Devart anterior es excelente, pero la pregunta de K2xL es válida. La respuesta que encontré fue codificar en hexadecimal la columna de nombre usando HEX (), lo que garantiza que creará JSON válido. Luego, en la aplicación, convierte el hexadecimal de nuevo en la cadena.

(Perdón por la autopromoción, pero) Escribí una pequeña publicación en el blog sobre esto con un poco más de detalle: http://www.alexkorn.com/blog/2015/05/hand-rolling-valid-json-in-mysql-using-group_concat/

[Editar para Oriol] Aquí hay un ejemplo:

SELECT email, CONCAT( ''['', GROUP_CONCAT(CONCAT( ''{name:"'', name, ''", phone:"'', REPLACE(REPLACE(phone, ''"'', ''////"''),''/n'',''////n''), ''"}'' )), '']'' ) AS list FROM table1 GROUP BY email;

También tenga en cuenta que he agregado un COALESCE en caso de que no haya elementos para ese correo electrónico.


Saliendo de la respuesta de @ Devart ... si el campo contiene saltos de línea o comillas dobles, el resultado no será JSON válido.

Entonces, si sabemos que el campo "teléfono" contiene comillas dobles y saltos de línea, nuestro SQL se vería así:

[{name:"Ben", phone:"655/"5333"},{name:"Joi", phone:"343/n4356"}]

Si Ben phone tiene una cita en medio de ella, y Joi''s tiene una nueva línea, el SQL daría (JSON válido) resultados como:

SELECT email,concat(''{name:"'',ur_name_column,''",phone:"'',ur_phone_column,''"}'') as list FROM table1 GROUP BY email;


Usar asi

SELECT email,concat(''{name:"'',ur_name_column,''",phone:"'',ur_phone_column,''"}'') as list FROM table1 GROUP BY email;

Aclamaciones