2012-09-20 49 views
21

¿Cómo se crea el formato json con group-concat mysql?¿Cómo se crea el formato json con group-concat mysql?

(utilizo MySQL)

Ejemplo 1:

tabla1:

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 dio el formato:

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

salida que me necesidad:

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

Gracias

+1

Si su base de datos va creciendo, esto es una mala idea. Mejor hazlo usando código en tu aplicación. –

+0

db static para readonly parpose – Yosef

Respuesta

35

Intentar esta consulta -

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

formato JSON resultado -

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

muchas gracias – Yosef

+3

¿qué pasaría si el nombre contiene una comilla doble? – K2xL

+0

Depende del modo ANSI_QUOTES SQL, si está activado, entonces debe doblar "en los nombres, de lo contrario, funcionará. – Devart

1

uso como esto

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

Cheers

10

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

(Lo siento por la auto-promoción, pero) me escribió un pequeño post 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] He aquí un ejemplo:

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 

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

+0

, ese es el solución. ¡Gracias! – serkan

+0

Agregue el ejemplo complejo de concat en su respuesta. Creo que es muy útil ;-) – Oriol

+0

Esto resolvió mi problema, otras soluciones fallaron al decodificar el json resultante con caracteres inválidos como pestañas, barras, ... – Mirko

18

Con las nuevas versiones 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 

Espero que ayude.

0

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

Por lo tanto, si conocemos el campo "teléfono" contiene ocasionalmente entre comillas dobles y saltos de línea, nuestra SQL se vería así:

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

Si Ben teléfono tiene una cita en el centro de la misma, y ​​Joi de cuenta un salto de línea, el SQL daría resultados válidos (JSON) como:

[{name:"Ben", phone:"655\"5333"},{name:"Joi", phone:"343\n4356"}]
Cuestiones relacionadas