我的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
您的示例数据仅显示4个键的结果,而数据中的结果不仅仅是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
| 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 |
如果您的标记值范围从a
到z
,那么一个(丑陋但有效)解决方案是使用更多UNION ALL SELECT
s扩展子查询。