MySQL Stored Proc создает многомерный JSON

У меня есть таблица со следующей структурой данных:

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`

См. также:  Руководство для начинающих по API, протоколам и форматам данных
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. iMarh

    Один вариант:

    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.

    Может быть, я нашел что-то странное. Независимо от того, добавляю ли я порядок по возрастанию date, я получаю случайно упорядоченный результат. Но мне нужно заказать по дате возрастания. person iMarh; 12.02.2020

    Нашли решение — порядок по date asc должен быть внутри group_concat() перед разделителем — stackoverflow.com/questions/8631210/ person iMarh; 12.02.2020

    А теперь интересно, как сохранить порядок der.name_age таким же образом, как они хранятся в таблице, то есть — Джон (20), Петр (21), Джон (26), Петр (47)…? person iMarh; 12.02.2020

    Привет еще раз. Итак, теперь мне интересно, как получить каждую N-ю (скажем, каждую 5-ю) строку в JSON, где находится часть date:value group_concat()? person iMarh; 12.04.2020

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: