【问题标题】:MySQL Stored Proc build multidimensional JSONMySQL Stored Proc 构建多维 JSON
【发布时间】:2020-05-25 00:59:11
【问题描述】:

我有以下数据结构的表:

name | age |     date    | value
---------------------------------
John | 20  |  2020-01-01 |   5
Peter| 21  |  2020-01-02 |  6.5
John | 26  |  2019-02-26 |  1.8
John | 20  |  2029-10-13 |  0.7
Peter| 47  |  2020-01-18 | 11.3
Peter| 21  |  2020-02-01 | 41.7
John | 20  |  2020-01-22 |   4

我只想通过 Mysql 5.5.5 Stored Proc(没有 json 聚合函数)来获得这样的结果:

{
  "John (20)" : {
    ["2020-01-01", 5],
    ["2029-10-13", 0.7],
    ["2029-10-13", 4]
  },
  "John (26)" : {
    ["2019-02-26", 1.8]
  },
  "Peter (21)" : {
    ["2020-01-02", 6.5],
    ["2020-02-01", 41.7],
  },
  "Peter (47)" : {
    ["2020-01-18", 11.3]
  }
}

并且无法弄清楚如何制作它。只获取平面 json....

   select concat('[', group_concat(
   '{"name":"',`name`,'",',
   '"age":"',`age`,'",',
   '"date":"',`date`,'",',
   '"value":',`value`, '}' separator ','), ']') from `data`

【问题讨论】:

    标签: mysql json multidimensional-array proc sp


    【解决方案1】:

    一个选项:

    SELECT
      CONCAT(
        '{',
        GROUP_CONCAT(
          CONCAT(
            `der`.`name_age`,
            ': {',
            `der`.`date_value`,
            '}'
          )
          SEPARATOR ', '),
        '}'
      ) `json_result`
    FROM (
      SELECT
        CONCAT(
          '"',
          `name`,
          ' (', `age`, ')"'
        ) `name_age`,
        GROUP_CONCAT(
          CONCAT(
            '["',
            `date`,
            '", ',
            `value`,
            ']'
          )
          SEPARATOR ', ') `date_value`
      FROM
        `data`
      GROUP BY
        `name`, `age`
    ) `der`;
    

    dbfiddle

    【讨论】:

    • 也许我发现了一些奇怪的东西。无论我是否添加“ order by date asc ”,我都会收到随机排序的结果。但我需要按日期排序。
    • 已经找到解决方案 - “order by date asc”必须在 group_concat() 之前的分隔符 - stackoverflow.com/questions/8631210/…
    • 现在想知道如何保持der.name_age 的排序方式与它们存储在表中的方式相同,即 - John (20)、Peter (21)、John (26)、彼得 (47)...?
    • 你好。所以现在我想知道如何在“date”:“value” group_concat() 部分所在的 JSON 中获取每第 N 行(比如说每 5 行)?
    猜你喜欢
    • 2012-12-14
    • 1970-01-01
    • 2012-01-23
    • 2015-07-08
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2017-06-18
    • 1970-01-01
    相关资源
    最近更新 更多