Comment créer le format json avec group-concat mysql?
comment créer le format json avec group-concat mysql?
(j'utilise MySQL)
Exemple1:
table1:
email | name | phone
-------------------------------------
my1@gmail.com | Ben | 6555333
my2@gmail.com | Tom | 2322452
my2@gmail.com | Dan | 8768768
my1@gmail.com | Joi | 3434356
comme la syntaxe de code qui me donne pas le format suivant:
select email, group-concat(name,phone) as list from table1 group by email
sortie que j'ai besoin:
email | list
------------------------------------------------
my1@gmail.com | {name:"Ben",phone:"6555333"},{name:"Joi",phone:"3434356"}
my2@gmail.com | {name:"Tom",phone:"2322452"},{name:"Dan",phone:"8768768"}
Merci
5 réponses
Essayez cette requête
SELECT
email,
GROUP_CONCAT(CONCAT('{name:"', name, '", phone:"',phone,'"}')) list
FROM
table1
GROUP BY
email;
format JSON résultat -
+---------------+-------------------------------------------------------------+
| email | list |
+---------------+-------------------------------------------------------------+
| my1@gmail.com | {name:"Ben", phone:"6555333"},{name:"Joi", phone:"3434356"} |
| my2@gmail.com | {name:"Tom", phone:"2322452"},{name:"Dan", phone:"8768768"} |
+---------------+-------------------------------------------------------------+
avec les nouvelles versions de MySQL, vous pouvez utiliser la fonction JSON_OBJECT pour obtenir le résultat souhaité, comme suit:
GROUP_CONCAT(
JSON_OBJECT(
'name', name,
'phone', phone
)
) AS list
pour obtenir la réponse SQL prête à être analysée comme un tableau:
CONCAT(
'[',
GROUP_CONCAT(
JSON_OBJECT(
'name', name,
'phone', phone
)
),
']'
) AS list
Cela vous donnera une chaîne de la forme:
la réponse de Devart ci-dessus est excellente, mais la question de K2xL est valide. La réponse que j'ai trouvée était d'hexadécimal-encoder la colonne name En utilisant HEX(), qui assure qu'elle va créer JSON valide. Puis dans l'application, Convertissez l'hexadécimal en chaîne de caractères.
(Désolé pour l'auto-promotion, mais) j'ai écrit un petit billet de blog à ce sujet avec un peu plus de détail: http://www.alexkorn.com/blog/2015/05/hand-rolling-valid-json-in-mysql-using-group_concat/
[Edit pour Oriol] Voici un exemple:
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
notez aussi que j'ai ajouté une COALESCE au cas où il n'y aurait pas d'articles pour cet email.
fin de la réponse de @Devart... si le champ contient des linebreaks ou des guillemets doubles, le résultat ne sera pas JSON valide.
donc, si nous savons que le champ "phone" contient parfois des doubles-citations et des linebreaks, notre SQL ressemblerait à:
SELECT email, CONCAT( '[', GROUP_CONCAT(CONCAT( '{name:"', name, '", phone:"', REPLACE(REPLACE(phone, '"', '\\"'),'\n','\\n'), '"}' )), ']' ) AS list FROM table1 GROUP BY email;
Si Ben phone a un devis au milieu de celui-ci, et Joi a une nouvelle ligne, le SQL donnerait (valide JSON) des résultats comme:
[{name:"Ben", phone:"655\"5333"},{name:"Joi", phone:"343\n4356"}]
Utiliser comme ceci
SELECT email,concat('{name:"',ur_name_column,'",phone:"',ur_phone_column,'"}') as list FROM table1 GROUP BY email;
Cheers