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

29
demandé sur Yosef 2012-09-20 15:45:53

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"} |
+---------------+-------------------------------------------------------------+
46
répondu Devart 2012-09-20 12:25:29

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:

32
répondu myusuf 2018-09-23 09:53:20

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.

12
répondu alexkorn 2018-04-05 18:16:20

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"}]
1
répondu Jonathan Harford 2017-02-24 21:41:31

Utiliser comme ceci

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

Cheers

0
répondu Sundar G 2012-09-20 12:06:50