组密钥Json,求和和动态如何?

时间:2019-02-24 19:19:46

标签: mysql sql json mariadb

我的mariadb服务器中有一个json列。我遇到一个问题:我无法对json进行分组。

我尝试使用过程和功能,但是连续失败 我希望包括一些方法,以向比我本人更擅长于此的朋友提供此解决方案

样本数据:

id   name           json
------------------------------------------------------
1    lorem ipsum    {"a":2,"b": 10, "c": 20}
2    lorem ipsum2   {"a":1, "b":8, "c": 21, "d":7}
2    lorem ipsum2   {"b":1, "e":8, "h": 21, "j":7}

现在,我想要这样的输出数据,计算值,然后确定是否将数据从json对象的A增加到Z:

key  average  max_value  min_value  sum_value  count_data
---------------------------------------------------------
a    1.5      2          1          3          2
b    8.2      10         1          19         3
c    20.5     21         20         41         2
d    7        7          7          7          1

1 个答案:

答案 0 :(得分:1)

您的示例数据仅显示4个键的结果,而数据中的结果则更多。如果您想要一组固定键的结果,这是一种解决方案;它使用子查询列出应考虑的键,并在外部查询中使用条件聚合JSON_EXTRACT使您可以访问对象的内容:

SELECT
    v.val,
    AVG(JSON_EXTRACT(js, CONCAT('$.', v.val))) AS average,
    MAX(JSON_EXTRACT(js, CONCAT('$.', v.val))) AS max_value,
    MIN(JSON_EXTRACT(js, CONCAT('$.', v.val))) AS min_value,
    SUM(JSON_EXTRACT(js, CONCAT('$.', v.val))) AS sum_value,
    COUNT(JSON_EXTRACT(js, CONCAT('$.', v.val))) AS count_data
FROM t
CROSS JOIN (
    SELECT 'a' val UNION ALL SELECT'b' UNION ALL SELECT'c' UNION ALL SELECT'd'
) v
GROUP BY v.val   

Demo on DB Fiddle

| val | average | max_value | min_value | sum_value | count_data |
| --- | ------- | --------- | --------- | --------- | ---------- |
| a   | 1.5     | 2         | 1         | 3         | 2          |
| b   | 6.3333  | 8         | 1         | 19        | 3          |
| c   | 20.5    | 21        | 20        | 41        | 2          |
| d   | 7       | 7         | 7         | 7         | 1          |

如果您的标记值的范围是az,则一种解决方案(丑陋但可行)是用更多UNION ALL SELECT个扩展子查询。