web-dev-qa-db-fra.com

Comment créer un format json avec mysql group-concat?

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

33
Yosef

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"} |
+---------------+-------------------------------------------------------------+
58
Devart

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.

47
myusuf

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.

14
alexkorn

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 "}]
1
Jonathan Harford

Utiliser comme ça 

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

À votre santé

0
Sundar G

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 ...
0
Matthew Semik