Comment créer un format json avec mysql group-concat?
(J'utilise MySQL)
Exemple 1:
tableau 1:
email | name | phone
-------------------------------------
[email protected] | Ben | 6555333
[email protected] | Tom | 2322452
[email protected] | Dan | 8768768
[email protected] | Joi | 3434356
comme un code de syntaxe qui ne me donne pas le format:
select email, group-concat(name,phone) as list from table1 group by email
sortie dont j'ai besoin:
email | list
------------------------------------------------
[email protected] | {name:"Ben",phone:"6555333"},{name:"Joi",phone:"3434356"}
[email protected] | {name:"Tom",phone:"2322452"},{name:"Dan",phone:"8768768"}
Merci
Essayez cette requête -
SELECT
email,
GROUP_CONCAT(CONCAT('{name:"', name, '", phone:"',phone,'"}')) list
FROM
table1
GROUP BY
email;
Résultat au format JSON -
+---------------+-------------------------------------------------------------+
| email | list |
+---------------+-------------------------------------------------------------+
| [email protected] | {name:"Ben", phone:"6555333"},{name:"Joi", phone:"3434356"} |
| [email protected] | {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 que la réponse SQL soit prête à être analysée sous forme de tableau:
CONCAT(
'[',
GROUP_CONCAT(
JSON_OBJECT(
'name', name,
'phone', phone
)
),
']'
) AS list
Cela vous donnera une chaîne comme: [{name: 'ABC', phone: '111'}, {name: 'DEF', phone: '222'}]
qui peut être analysée par JSON. J'espère que cela t'aides.
La réponse de Devart ci-dessus est excellente, mais la question de K2xL est valide. La réponse que j’ai trouvée est de coder de manière hexadécimale la colonne de nom à l’aide de HEX (), ce qui garantit la création d’un fichier JSON valide. Ensuite, dans l'application, reconvertissez l'hexadécimal en chaîne.
(Désolé pour l'auto-promotion, mais) j'ai écrit un petit post à ce sujet avec un peu plus de détails: http://www.alexkorn.com/blog/2015/05/hand-rolling-valid -json-in-mysql-using-group_concat/
[Edit for 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 également que j'ai ajouté un COALESCE au cas où il n'y aurait pas d'éléments pour cet email.
Déconnexion de la réponse de @ Devart ... si le champ contient des sauts de ligne ou des guillemets, le résultat ne sera pas un code JSON valide.
Donc, si nous savons que le champ "phone" contient parfois des guillemets et des sauts de ligne, notre code SQL ressemblerait à ceci:
SÉLECTIONNER email, CONCAT ( '[', GROUP_CONCAT (CONCAT ( '{Nom: "', Nom, '", Téléphone: "', REMPLACER , '"', '\\\\"'), '\ n', '\\\\ n'), '"} )., '. '.'. ) AS list FROM table1 GROUP BY email;
Si Ben phone a une citation au milieu et que Joi a une nouvelle ligne, le code SQL donnerait (JSON valide) les résultats suivants:
[{nom: "Ben", téléphone: "655 \" 5333 "}, {nom:" Joi ", téléphone:" 343\n4356 "}]
Utiliser comme ça
SELECT email,concat('{name:"',ur_name_column,'",phone:"',ur_phone_column,'"}') as list FROM table1 GROUP BY email;
À votre santé
J'espère que cela trouve les bons yeux.
Vous pouvez utiliser (pour les tableaux):
JSON_ARRAYAGG(col_or_expr) as ...
(pour les objets)
JSON_OBJECTAGG(key, value) as ...