从MySQL中的JSON字符串中提取密钥

时间:2019-05-24 09:48:48

标签: mysql sql mysql-workbench

我的表包含json格式的字符串。我需要获取每个键的总和和平均值。

+----+------------------------------------------------------------------------------------+------------+
| id | json_data                                                                          | subject_id |
+----+------------------------------------------------------------------------------------+------------+
| 1  | {"id": "a", "value": "30"}, {"id": "b", "value": "20"}, {"id": "c", "value": "30"} | 1          |
+----+------------------------------------------------------------------------------------+------------+
| 2  | {"id": "a", "value": "40"}, {"id": "b", "value": "50"}, {"id": "c", "value": "60"} | 1          |
+----+------------------------------------------------------------------------------------+------------+
| 3  | {"id": "a", "value": "20"}                                                         | 1          |
+----+------------------------------------------------------------------------------------+------------+

预期结果是

    {"id": "a", "sum": 90, "avg": 30},
    {"id": "b", "sum": 70, "avg": 35},
    {"id": "c", "sum": 120, "avg": 40}

我尝试过

SELECT (
  JSON_OBJECT('id', id, 'sum', sum_data, 'avg', avg_data)
) FROM (
  SELECT 
    JSON_EXTRACT(json_data, "$.id") as id, 
    SUM(JSON_EXTRACT(json_data, "$.sum_data")) as sum_data, 
    AVG(JSON_EXTRACT(json_data, "$.avg_data")) as avg_data
  FROM Details 
  GROUP BY JSON_EXTRACT(json_data, "$.id")
) as t 

但是没有运气。我该如何解决呢?

1 个答案:

答案 0 :(得分:2)

输入json需要更正

create table json_sum (id int primary key auto_increment, json_data json);

insert into json_sum values (0,'[{"id": "a", "value": "30"}, {"id": "b", "value": "20"}, {"id": "c", "value": "30"}]');
insert into json_sum values (0,'[{"id": "a", "value": "40"}, {"id": "b", "value": "50"}, {"id": "c", "value": "60"}]');
insert into json_sum values (0,'[{"id": "a", "value": "20"}]');

select 
 json_object("id", jt.id, "sum", sum(jt.value), "avg", avg(jt.value))
 from json_sum, json_table(json_data, "$[*]" columns (
        row_id for ordinality,
        id varchar(10) path "$.id",
        value varchar(10) path "$.value")
) as jt
group by jt.id

输出:

json_object("id", jt.id, "sum", sum(jt.value), "avg", avg(jt.value))
{"id": "a", "avg": 30.0, "sum": 90.0}
{"id": "b", "avg": 35.0, "sum": 70.0}
{"id": "c", "avg": 45.0, "sum": 90.0}