66

如何使用 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

就像没有给我格式的语法代码:

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"}

谢谢

4

8 回答 8

93

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

GROUP_CONCAT(
  JSON_OBJECT(
    'name', name,
    'phone', phone
  )
) AS list

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

CONCAT(
  '[',
  GROUP_CONCAT(
    JSON_OBJECT(
      'name', name,
      'phone', phone
    )
  ),
  ']'
) AS list

这会给你一个类似的字符串:[{name: 'ABC', phone: '111'}, {name: 'DEF', phone: '222'}]它可以被 JSON 解析。希望这可以帮助。

于 2016-10-25T08:36:17.890 回答
82

试试这个查询 -

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

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"} |
+---------------+-------------------------------------------------------------+
于 2012-09-20T12:06:35.183 回答
28

我希望这能找到正确的眼睛。

您可以使用:

对于数组文档):

JSON_ARRAYAGG(col_or_expr) as ...

对于对象文档):

JSON_OBJECTAGG(key, value) as ...
于 2019-01-18T19:48:56.520 回答
26

对于 MySQL 5.7.22+

    SELECT
        email,
        JSON_ARRAYAGG(
            JSON_OBJECT(
                'name', name,
                'phone', 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}] |
+---------------+-------------------------------------------------------------------+

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

于 2019-10-22T17:51:19.407 回答
19

上面德瓦特的回答很好,但 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

另请注意,我添加了一个 COALESCE 以防该电子邮件没有项目。

于 2015-05-12T18:58:40.247 回答
4

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

SELECT
        email,
       CAST( CONCAT(
        '[', 
           GROUP_CONCAT(
           JSON_OBJECT(
              'name', name,
              'phone', phone
            )
        ),']') AS JSON )
    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}] |
+---------------+-------------------------------------------------------------------+

于 2020-06-10T19:29:29.407 回答
3

离开@Devart 的答案......如果该字段包含换行符或双引号,则结果将不是有效的 JSON。

因此,如果我们知道“电话”字段偶尔包含双引号和换行符,我们的 SQL 将如下所示:

选择
  电子邮件,
  连接(
    '[',
    GROUP_CONCAT(CONCAT(
        '{姓名:”',
        姓名,
        '“, 电话:”',
        替换(替换(电话,'"','\\\\"'),'\n','\\\\n'),
        '"}'
      )),
    ']'
  ) 作为列表
FROM table1 GROUP BY 电子邮件;

如果 Ben phone 中间有引号,而 Joi 有换行符,则 SQL 将给出(有效 JSON)结果,如:

[{姓名:“Ben”,电话:“655\“5333”},{姓名:“Joi”,电话:“343\n4356”}]
于 2017-02-24T18:28:57.197 回答
0

像这样使用

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

干杯

于 2012-09-20T12:06:50.217 回答