【问题标题】:How create json format with group-concat mysql?如何使用 group-concat mysql 创建 json 格式?
【发布时间】:2012-09-12 18:41:06
【问题描述】:

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

谢谢

【问题讨论】:

  • 如果您的数据库要增长,这是个坏主意。最好在您的应用程序中使用代码。
  • db static for readonly parpose

标签: mysql sql group-concat


【解决方案1】:

试试这个查询 -

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

【讨论】:

  • 如果名称中包含双引号会怎样?
  • 这取决于 ANSI_QUOTES SQL 模式,如果它被激活 - 那么你应该在名称中加倍 ",否则 - 它会起作用。
  • 很抱歉这不是一个有效的 JSON... JSON 数组包含在 [ 和 ] 之间
  • 作为我编辑的旁注,如果您愿意,可以使用 MySQL 5.7 中的新 JSON 函数。请参阅:dev.mysql.com/doc/refman/5.7/en/…
  • @AntonioOrtells,为了使它有效,你会这样做,我也这样做了,只需使用 CONCAT('[', GROUP_CONCAT(…), ']') list 调整部分,这会将其包裹在数组括号中,其余的由 GROUP_CONCAT 中的逗号完成。
【解决方案2】:

这样使用

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

干杯

【讨论】:

  • 将抛出警告(和不一致的结果),因为您正在检索带有 GROUP BY 子句的非分组非唯一列(如果 ur_name_column 包含,则容易发生 JSOn 注入双引号或黑斜线)
【解决方案3】:

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

(很抱歉自我推销,但是)我写了一篇关于此的小博客文章,其中包含更多细节: http://www.alexkorn.com/blog/2015/05/hand-rolling-valid-json-in-mysql-using-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,以防该电子邮件没有项目。

【讨论】:

  • 在您的答案中添加复杂的 concat 示例。我认为这很有帮助;-)
  • 这解决了我的问题,其他解决方案在解码带有无效字符(如制表符、斜杠、...)的 json 时失败了。
  • namephone 键必须在 ""(双引号)中才能表示有效的 json
  • kekko12:已修复。谢谢!
  • TO_BASE64 可能会降低HEX 引入的超额成本(即:字符串更短)。但是现在的 MySQL 使用 stackoverflow.com/a/40235188/2342518
【解决方案4】:

使用较新版本的 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 解析。希望这会有所帮助。

【讨论】:

  • 有没有像->->> 这样的简写,但对于CONCAT('[', GROUP_CONCAT(JSON_OBJECT(...) SEPARATOR ','), ']')
  • 太好了,节省我的时间。
  • 关于如何使用IF 省略记录(如果它是空白的)的任何建议?如果它是一个空记录集,它的书面如何返回{"name": null, "phone": null}
【解决方案5】:

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

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

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

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

[{name:"Ben", phone:"655\"5333"},{name:"Joi", phone:"343\n4356"}]

【讨论】:

    【解决方案6】:

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

    你可以使用:

    对于数组 (documentation):

    JSON_ARRAYAGG(col_or_expr) as ...
    

    对于对象 (documentation):

    JSON_OBJECTAGG(key, value) as ...
    

    【讨论】:

    • 重要的是要注意,根据this,这些在 5.7.22+ 中可用
    • 在撰写此评论时,它们在 Amazon aurora 5.7 中均不可用
    【解决方案7】:

    适用于 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

    【讨论】:

      【解决方案8】:

      与上述 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}] |
      +---------------+-------------------------------------------------------------------+
      
      

      【讨论】:

      • 你的 DBMS 是什么,你可以在 sql server 中使用 json 路径
      • 对不起,我错过了..这是针对 Mysql 5.7.26
      • 唯一要记住的是,当您使用 GROUP_CONCAT 时,您只能有 1024 个字符。如果您的 JSON 长度更长,那么我建议您遵循以下答案。 stackoverflow.com/a/58509829/8197832
      猜你喜欢
      • 1970-01-01
      • 2019-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 2014-05-13
      • 1970-01-01
      相关资源
      最近更新 更多