MySQL JSON 字段求和

注意: 此用法仅支持 MySQL 8.0 以上的版本

我们假设一个场景,字段中存储一个日期的 JSON,这个 JSON 的 Key 为星期的英文名称,具体 JSON 格式如下:

{
    "monday": 390,
    "Tuesday": 240,
    "Wednesday": 150,
    "Thursday": 160,
    "Friday": 150,
    "Saturday": 270,
    "Sunday": 180
}

我们需要做的是对这些值进行取和,而 MySQL 自身并不支持 JSON 值的 聚合运算,但是我们可以通过 MySQL8 的新函数  JSON_TABLE  来的实现这个需求。

具体写法如下:

第一步,我们先拿到 JSON 的 VALUE 值

select * from JSON_TABLE('{"monday":390,"Tuesday":240,"Wednesday":150,"Thursday":160,"Friday":150,"Saturday":270,"Sunday":180}',"$.*" COLUMNS(
    rowid FOR ORDINALITY,
    price int PATH "$"
)) as temp

-- 查询结果如下,我们可以获取到所有的VALUE
+-------+
| price |
+-------+
|   150 |
|   180 |
|   390 |
|   240 |
|   270 |
|   160 |
|   150 |
+-------+
7 rows in set (0.03 sec)

第二步,上面 SQL 的基础上 使用聚合函数  SUM()  来获取所有值的和:

select SUM(price) from JSON_TABLE('{"monday":390,"Tuesday":240,"Wednesday":150,"Thursday":160,"Friday":150,"Saturday":270,"Sunday":180}',"$.*" COLUMNS(
    rowid FOR ORDINALITY,
    price int PATH "$"
)) as temp

-- 聚合值输出结果如下:
+------------+
| SUM(price) |
+------------+
| 1540       |
+------------+

这样我们就可以拿到一个 JSON 格式的聚合结果,实际应用我们可以结合以下方案:

  • 将聚合 JSON 的 SQL 写成一个 自定义函数,在 MySQL 使用的时候直接传入 JSON 存储字段来简化查询

  • 如果需要对 JSON 结果进行查询,那么 使用 JSON 函数的效率是极低的,可以参考我博客的上一篇文章,自定义函数结合 MySQL 的虚拟列来提高查询速度

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在MySQL中对JSON数组进行求和,你可以使用自定义函数来实现。引用中的示例是一个使用存储过程来实现JSON数组求和的示例。这个存储过程接收一个整数参数ids,然后通过查询获取JSON数组的长度,并使用循环遍历数组中的每个元素,将其累加到sun变量中。最后,返回sun的值作为求和结果。 另外,引用中提到,MySQL自身并不支持对JSON值的聚合运算,但可以通过MySQL 8中新增的函数JSON_TABLE来实现。JSON_TABLE函数可以将JSON数组转换成关系表格,然后可以使用常规的聚合函数进行求和操作。 另外,引用中提到,可以将聚合JSON的SQL写成一个自定义函数,这样在使用MySQL时可以直接传入JSON存储字段来简化查询。这种方式可以更加简化对JSON数组求和的操作。 综上所述,要在MySQL中对JSON数组求和,你可以使用存储过程、JSON_TABLE函数或自定义函数来实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [MySQL 循环遍历json数组相加](https://blog.csdn.net/m0_46506305/article/details/124099694)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [MySQL JSON 字段求和](https://blog.csdn.net/m0_57290114/article/details/124090824)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值