You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写MySQL查询汇总JSON字段中各box的books与pen数值?

MySQL JSON字段分组汇总查询方案

问题背景

现有user_data表结构如下:

CREATE TABLE `user_data` (
  `id` int(11) NOT NULL,
  `user` varchar(100) NOT NULL,
  `data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL CHECK (json_valid(`data`))
)

表中data字段为JSON格式,存储以box为键、包含books和pen数值的嵌套数据,表内数据示例:

iduserdata
11{"box1": {"books": 12, "pen": 100},"box2": {"books": 13, "pen": 200},"box4": {"books": 17, "pen": 300},"box5": {"books": 16, "pen": 300}}
25{"box1": {"books": 12, "pen": 100},"box2": {"books": 13, "pen": 200},"box3": {"books": 14, "pen": 300}}

需要实现按box分组,汇总对应books和pen的总和,期望结果:

boxbookspen
box124200
box226400
box314300
box417300
box516300

解决方案

可以利用MySQL的JSON函数JSON_TABLE将JSON对象拆分为行数据,再进行分组汇总,查询语句如下:

SELECT
    j.box_name AS box,
    SUM(j.books) AS books,
    SUM(j.pen) AS pen
FROM
    user_data,
    JSON_TABLE(
        JSON_KEYS(data),
        '$[*]' COLUMNS(
            box_name VARCHAR(100) PATH '$',
            books INT PATH CONCAT('$.', '$', '.books'),
            pen INT PATH CONCAT('$.', '$', '.pen')
        )
    ) AS j
GROUP BY
    j.box_name
ORDER BY
    j.box_name;

语句说明

  • JSON_KEYS(data):提取data字段中所有box的键名(如box1、box2等)。
  • JSON_TABLE:将JSON键名转换为行数据,并通过CONCAT拼接路径,提取每个box对应的books和pen数值。
  • 最后通过GROUP BY按box分组,使用SUM函数汇总数值。

内容的提问来源于stack exchange,提问作者prabhakaran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 06:23:16