如何使用group-concat mysql创建json格式?

Yos*_*sef 42 mysql sql group-concat

如何使用group-concat mysql创建json格式?

(我使用MySQL)

例1:

表格1:

email            |    name  |   phone
-------------------------------------
my1@gmail.com    | Ben      | 6555333
my2@gmail.com    | Tom      | 2322452
my2@gmail.com    | Dan      | 8768768
my1@gmail.com    | Joi      | 3434356
Run Code Online (Sandbox Code Playgroud)

像语法代码,不给我格式:

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

我需要的输出:

email         |    list
------------------------------------------------
my1@gmail.com |  {name:"Ben",phone:"6555333"},{name:"Joi",phone:"3434356"}
my2@gmail.com |  {name:"Tom",phone:"2322452"},{name:"Dan",phone:"8768768"}
Run Code Online (Sandbox Code Playgroud)

谢谢

Dev*_*art 66

试试这个查询 -

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

JSON格式结果 -

+---------------+-------------------------------------------------------------+
| email         | list                                                        |
+---------------+-------------------------------------------------------------+
| my1@gmail.com | {name:"Ben", phone:"6555333"},{name:"Joi", phone:"3434356"} |
| my2@gmail.com | {name:"Tom", phone:"2322452"},{name:"Dan", phone:"8768768"} |
+---------------+-------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

  • 如果name包含双引号会发生什么? (5认同)
  • 很遗憾地说这不是一个有效的JSON ... JSON数组包含在[和]之间 (3认同)
  • @AntonioOrtells,为了使它有效,你做了,我做了,只需用`CONCAT('[',GROUP_CONCAT(...),']')list`调整部分,这将它包装在数组括号中,来自GROUP_CONCAT的逗号其余的部分. (2认同)

myu*_*suf 62

使用较新版本的MySQL,您可以使用JSON_OBJECT函数来实现所需的结果,如下所示:

GROUP_CONCAT(
  JSON_OBJECT(
    'name', name,
    'phone', phone
  )
) AS list
Run Code Online (Sandbox Code Playgroud)

要准备好将SQL响应解析为数组:

CONCAT(
  '[',
  GROUP_CONCAT(
    JSON_OBJECT(
      'name', name,
      'phone', phone
    )
  ),
  ']'
) AS list
Run Code Online (Sandbox Code Playgroud)

这将为您提供一个字符串:[{name: 'ABC', phone: '111'}, {name: 'DEF', phone: '222'}]可以对JSON进行解析.希望这可以帮助.


Mad*_*col 22

对于 MySQL 5.7.22+

    SELECT
        email,
        JSON_ARRAYAGG(
            JSON_OBJECT(
                'name', name,
                'phone', phone
            )
        ) AS list
    FROM table1
    GROUP BY email;
Run Code Online (Sandbox Code Playgroud)

结果:

+---------------+-------------------------------------------------------------------+
| email         | list                                                              |
+---------------+-------------------------------------------------------------------+
| my1@gmail.com | [{"name":"Ben", "phone":6555333},{"name":"Joi", "phone":3434356}] |
| my2@gmail.com | [{"name":"Tom", "phone":2322452},{"name":"Dan", "phone":8768768}] |
+---------------+-------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

唯一的区别是列list现在是Json-valid,因此您可以直接解析为Json


ale*_*orn 17

Devart的答案很棒,但K2xL的问题是有效的.我找到的答案是使用HEX()对名称列进行十六进制编码,这可确保它将创建有效的JSON.然后在应用程序中,将十六进制转换回字符串.

(对不起自我推销,但是)我写了一篇关于这个的小博客文章,更详细一点:http: //www.alexkorn.com/blog/2015/05/hand-rolling-valid-json-in-的MySQL-使用-GROUP_CONCAT /

[编辑Oriol]这是一个例子:

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
Run Code Online (Sandbox Code Playgroud)

另请注意,我已添加COALESCE,以防该电子邮件没有任何项目.


Mat*_*mik 11

我希望这能找到合适的眼睛。

您可以使用:

对于数组文档):

JSON_ARRAYAGG(col_or_expr) as ...
Run Code Online (Sandbox Code Playgroud)

对于对象文档):

JSON_OBJECTAGG(key, value) as ...
Run Code Online (Sandbox Code Playgroud)

  • 需要特别注意的是,根据[this](https://dev.mysql.com/doc/refman/5.7/en/json-creation-functions.html),这些功能在5.7.22+中可用。 (5认同)
  • 在撰写此评论时,它们在 Amazon aurora 5.7 中均不可用 (2认同)

Rah*_*ngh 5

与上面 Madacol 的答案类似,但略有不同。除了 JSONARRAYAGG,您还可以 CAST AS JSON:

SELECT
        email,
       CAST( CONCAT(
        '[', 
           GROUP_CONCAT(
           JSON_OBJECT(
              'name', name,
              'phone', phone
            )
        ),']') AS JSON )
    FROM table1
    GROUP BY email;
Run Code Online (Sandbox Code Playgroud)

结果:

+---------------+-------------------------------------------------------------------+
| email         | list                                                              |
+---------------+-------------------------------------------------------------------+
| my1@gmail.com | [{"name":"Ben", "phone":6555333},{"name":"Joi", "phone":3434356}] |
| my2@gmail.com | [{"name":"Tom", "phone":2322452},{"name":"Dan", "phone":8768768}] |
+---------------+-------------------------------------------------------------------+

Run Code Online (Sandbox Code Playgroud)