MySQL JSON_ARRAYAGG 实现汇总+明细数据展示

一、业务场景

在投注记录查询功能中,我们需要展示每个彩票期号(userId + lotteryIssue分组)的汇总数据(总金额、总注数),同时也要显示该期号下的所有明细投注记录。

解决方案:JSON_ARRAYAGG

MySQL 5.7+ 提供的 JSON_ARRAYAGG 函数完美解决了这个问题,它可以将多行数据聚合成一个JSON数组。

二、代码实现

1. 后端接口(Controller层)

@GetMapping("/records")
public AjaxResult records(HttpServletRequest request,@RequestParam(defaultValue = "1") Integer pageNum,@RequestParam(defaultValue = "20") Integer pageSize) {return service.records(request, pageNum, pageSize);
}
  • 接收分页参数,调用服务层

2. 服务层(Service层)

public AjaxResult records(HttpServletRequest request, Integer pageNum, Integer pageSize) {UserVo user = JwtUtils.getUser(request.getHeader("token")); // 鉴权List<FastThreeBettingVo> list = mapper.selectRecordsByUserId(user.getUserId());return AjaxResult.success(list); // 返回带分级的数据
}

3. 数据结构(VO对象)

@Data
public class FastThreeBettingVo {// 用户private Long userId;// 期号private String lotteryIssue;// 总金额private BigDecimal totalAmount;// 总注数private Long totalCount;// 投注详情列表private List<FastThreeBettingDetail> children;// 手动设置 children 的方法public void setChildren(String detailsJson) {ObjectMapper objectMapper = new ObjectMapper();try {// 将 JSON 字符串解析为 List<xx>this.children = objectMapper.readValue(detailsJson, new TypeReference<List<FastThreeBettingDetail>>() {});// 对 children 按 lotteryIssue 倒序排序sortChildrenByLotteryIssueDesc();} catch (Exception e) {throw new RuntimeException("Failed to parse details JSON", e);}}// 按 lotteryIssue 倒序排序 children 的方法private void sortChildrenByLotteryIssueDesc() {if (this.children != null && !this.children.isEmpty()) {// 使用 Comparator 对 lotteryIssue 进行倒序排序this.children.sort((detail1, detail2) -> {String issue1 = detail1.getLotteryIssue();String issue2 = detail2.getLotteryIssue();return issue2.compareTo(issue1); // 倒序排序});}}
}

4. 数据结构(children对象)

@Data
public class FastThreeBettingDetail {// 期号private String lotteryIssue;// 玩法名称private String clzName;// 下注信息private String specialName;// 下注金额private BigDecimal amount;// 中奖状态 0=待开奖 1=中奖 2=未中奖private String winningStatus;// 中奖金额private BigDecimal winningAmount;
}

5. 核心SQL(Mapper层)

  1. 明细聚合JSON_ARRAYAGG + JSON_OBJECT 将明细记录转为JSON数组

    <select id="selectRecordsByUserId" parameterType="Long" resultType="com.ruoyi.ruoyiliushu.mo.ls_fast_three_user_betting.vo.FastThreeBettingVo">SELECTuser_id AS userId,lottery_issue AS lotteryIssue,SUM(amount) AS totalAmount,COUNT(*) AS totalCount,JSON_ARRAYAGG(JSON_OBJECT('lotteryIssue', lottery_issue,'clzName', clz_name,'specialName', special_name,'amount', amount,'winningStatus',CASE winning_statusWHEN 0 THEN '待开'WHEN 1 THEN '中奖'WHEN 2 THEN '未中'ELSE '未知'END,'winningAmount', winning_amount)) AS childrenFROMls_fast_three_user_bettingwhereuser_id = #{userId}group byuser_id,lottery_issueorder bylottery_issue desclimit 1</select>

6. 输出结构

{"msg": "操作成功","code": 200,"data": [{"userId": 11,"lotteryIssue": "2025020010","totalAmount": 6.00,"totalCount": 6,"children": [{"lotteryIssue": "2025020010","clzName": "豹子","specialName": "6,6,6","amount": 1.00,"winningStatus": "未中","winningAmount": 169.00},{"lotteryIssue": "2025020010","clzName": "豹子","specialName": "5,5,5","amount": 1.00,"winningStatus": "未中","winningAmount": 169.00},{"lotteryIssue": "2025020010","clzName": "豹子","specialName": "4,4,4","amount": 1.00,"winningStatus": "未中","winningAmount": 169.00},{"lotteryIssue": "2025020010","clzName": "豹子","specialName": "3,3,3","amount": 1.00,"winningStatus": "未中","winningAmount": 169.00},{"lotteryIssue": "2025020010","clzName": "豹子","specialName": "2,2,2","amount": 1.00,"winningStatus": "未中","winningAmount": 169.00},{"lotteryIssue": "2025020010","clzName": "豹子","specialName": "1,1,1","amount": 1.00,"winningStatus": "未中","winningAmount": 169.00}]}]
}

三、函数详解

1. JSON_OBJECT 函数

功能

JSON_OBJECT 用于创建一个JSON对象(键值对集合)

语法

sqlJSON_OBJECT(key1, value1, key2, value2, ...)

代码示例

sqlJSON_OBJECT('lotteryIssue', lottery_issue,'clzName', clz_name,'specialName', special_name,'amount', amount,'winningStatus', CASE winning_status... END,'winningAmount', winning_amount
)

运行效果

将每行数据转换为:

 

json{"lotteryIssue": "2025020010","clzName": "豹子","specialName": "6,6,6","amount": 1.00,"winningStatus": "未中","winningAmount": 169.00
}

 

2. JSON_ARRAYAGG 函数

功能

JSON_ARRAYAGG 将多行数据聚合成一个JSON数组

语法

sqlJSON_ARRAYAGG(expression)

代码示例

sqlJSON_ARRAYAGG(JSON_OBJECT(...)  -- 将每行的JSON对象聚合成数组
) AS children

运行效果

将分组内的所有明细记录转换为:

json[{第一条明细记录},{第二条明细记录},...
]

四. 注意事项

  1. MySQL版本要求:5.7+ 支持JSON函数

  2. 性能考虑:大数据量时可能影响性能

  3. 字段别名:Java VO中的字段名需与SQL中的别名一致

  4. NULL处理:默认会包含NULL值,可用NULL ON NULL控制

这两个函数配合使用,完美解决了SQL查询中"一对多"关系的结构化输出需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/905490.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Lua】Redis 自增并设置有效期

【Lua】Redis 自增并设置有效期 方案一 每次执行都会更新有效期 EVAL "local current redis.call(INCRBY, KEYS[1], ARGV[1]);if tonumber(ARGV[2]) > 0 then redis.call(EXPIRE, KEYS[1], ARGV[2]) end;return current;" 1 mycounter 1 10 参数: 1 代表KEY…

CCF第七届AIOps国际挑战赛季军分享(RAG)

分享CCF 第七届AIOps国际挑战赛的季军方案&#xff0c;从我们的比赛经历来看&#xff0c;并不会&#xff0c;相反&#xff0c;私域领域问答的优秀效果说明RAG真的很重要 历经4个月的时间&#xff0c;从初赛赛道第1&#xff0c;复赛赛道第2&#xff0c;到最后决赛获得季军&…

YOLO v2:目标检测领域的全面性进化

引言 在YOLO v1取得巨大成功之后&#xff0c;Joseph Redmon等人在2016年提出了YOLO v2&#xff08;也称为YOLO9000&#xff09;&#xff0c;这是一个在准确率和速度上都取得显著提升的版本。YOLO v2不仅保持了v1的高速特性&#xff0c;还通过一系列创新技术大幅提高了检测精度…

Linux-Ubuntu安装Stable Diffusion Forge

SD Forge在Win上配置起来相对简单且教程丰富&#xff0c;而在Linux平台的配置则稍有门槛且教程较少。本文提供一个基于Ubuntu24.04发行版&#xff08;对其他Linux以及SD分支亦有参考价值&#xff09;的Stable Diffusion ForgeUI安装配置教程&#xff0c;希望有所帮助 本教程以N…

量子计算实用化突破:从云端平台到国际竞合,开启算力革命新纪元

在硅谷某生物医药实验室&#xff0c;研究员艾米丽正盯着量子计算模拟界面露出微笑 —— 搭载中电信 "天衍" 量子计算云平台的 880 比特超导量子处理器&#xff0c;用 17 分钟完成了传统超算需 3 个月才能跑完的新型抗生素分子键合模拟。这个场景标志着量子计算正从 &…

计算机操作系统(七)详细讲解进程的组成与特性,状态与转换

计算机操作系统&#xff08;七&#xff09;进程的组成与特性&#xff0c;状态与转换 前言一、进程的组成1. 什么是“进程”&#xff1f;2. 进程的三个核心组成部分2.1 PCB&#xff08;进程控制块&#xff09;—— 进程的“身份证户口本”2.2 程序段—— 进程的“任务清单”2.3 …

MapReduce基本介绍

核心思想 分而治之&#xff1a;将大规模的数据处理任务分解成多个可以并行处理的子任务&#xff0c;然后将这些子任务分配到不同的计算节点上进行处理&#xff0c;最后将各个子任务的处理结果合并起来&#xff0c;得到最终的结果。 工作流程 Map 阶段&#xff1a; 输入数据被…

Linux操作系统实战:中断源码的性能分析(转)

Linux中断是指在Linux操作系统中&#xff0c;当硬件设备或软件触发某个事件时&#xff0c;CPU会中断正在执行的任务&#xff0c;并立即处理这个事件。它是实现实时响应和处理外部事件的重要机制&#xff0c;Linux中断可以分为两种类型&#xff1a;硬件中断和软件中断&#xff0…

AI Agent开发第66课-彻底消除RAG知识库幻觉-带推理的RAG

开篇 在第64课《AI Agent开发第64课-DIFY和企业现有系统结合实现高可配置的智能零售AI Agent(上)》中我们提到了提示词Rewrite,同时还讲到了2024年年末开始出现的新的理论,并把RAG系统推入到了3.0模式,业界出现了“3R”理念的RAG引擎,基于“3R”理念可以彻底消除RAG的幻觉…

Clion内置宏$PROJECT_DIR$等

CLion 内置宏 文章目录 CLion 内置宏通用路径相关宏路径相对化宏 官方文档地址&#xff1a; https://www.jetbrains.com/help/clion/built-in-macros.html 通用路径相关宏 宏名称含义说明示例$WORKSPACE_DIR$当前项目所属的工作区根目录路径。/home/user/workspace$PROJECT_D…

机器学习基础课程-5-课程实验

5.1 实验介绍 实验背景 在这个项目中&#xff0c;您将使用1994年美国人口普查收集的数据&#xff0c;选用几个监督学习算法以准确地建模被调查者的收入。然后&#xff0c;您将根据初步结果从中选择出最佳的候选算法&#xff0c;并进一步优化该算法以最好地建模这些数据。你的目…

Android RecyclerView自带的OnFlingListener,Kotlin

Android RecyclerView自带的OnFlingListener&#xff0c;Kotlin Android启动应用时屏蔽RecyclerView滑动&#xff0c;延时后再允许滑动&#xff0c;Kotlin-CSDN博客 使用了GestureDetectorRecyclerView的setOnTouchListener检测用户的快滑fling事件。发现RecyclerView也自带了监…

第3.4节 调用链路分析服务开发

3.4.1 什么是Code Call Graph&#xff08;CCG&#xff09; Code Call Graph&#xff08;CCG&#xff09;即业务代码中的调用关系图&#xff0c;是通过静态分析手段分析并构建出的一种描述代码间关系的图。根据精度不同&#xff0c;一般分为类级别、方法级别、控制流级别&#x…

【Liblib】基于LiblibAI自定义模型,总结一下Python开发步骤

一、前言 Liblib AI&#xff08;哩布哩布 AI&#xff09;是一个集成了先进人工智能技术和用户友好设计的 AI 图像创作绘画平台和模型分享社区。 强大的图像生成能力 &#xff1a;以 Stable Diffusion 技术为核心&#xff0c;提供文生图、图生图、图像后期处理等功能&#xff…

编程日志5.5

树的结构代码 #include<iostream> using namespace std; //由于树的每个结点可能有一些孩子结点,这些孩子结点的数量不确定,所以可以用一个链表来把所有的孩子结点给串起来 //链表结点定义 //这段代码定义了一个结构体ListNode,用于表示链表中的一个结点。这个结构…

【消息队列】RabbitMQ基本认识

目录 一、基本概念 1. 生产者&#xff08;Producer&#xff09; 2. 消费者&#xff08;Consumer&#xff09; 3. 队列&#xff08;Queue&#xff09; 4. 交换器&#xff08;Exchange&#xff09; 5. 绑定&#xff08;Binding&#xff09; 6. 路由键&#xff08;Routing …

uniapp -- 验证码倒计时按钮组件

jia-countdown-verify 验证码倒计时按钮组件 一个用于发送短信验证码的倒计时按钮组件&#xff0c;支持自定义样式、倒计时时间和文本内容。适用于各种需要验证码功能的表单场景。 代码已经 发布到插件市场 可以自行下载 下载地址 特性 支持自定义按钮样式&#xff08;颜色、…

知识图谱重构电商搜索:下一代AI搜索引擎的底层逻辑

1. 搜索引擎的进化论 从雅虎目录式搜索到Google的PageRank算法&#xff0c;搜索引擎经历了三次技术跃迁。而AI搜索引擎正在掀起第四次革命&#xff1a;在电商场景中&#xff0c;传统的「关键词匹配」已无法满足个性化购物需求&#xff0c;MOE搜索等新一代架构开始融合知识图谱…

深度学习 自然语言处理(RNN) day_02

1. 感知机与神经网络 1.1 感知机 生物神经元&#xff1a; 1.1.1 感知机的概念 感知机&#xff08;Perceptron&#xff09;&#xff0c;又称神经元&#xff08;Neuron&#xff0c;对生物神经元进行了模仿&#xff09;是神 经网络&#xff08;深度学习&#xff09;的起源算法&am…

PYTHON训练营DAY25

BUG与报错 一、try else try:# 可能会引发异常的代码 except ExceptionType: # 最好指定具体的异常类型&#xff0c;例如 ZeroDivisionError, FileNotFoundError# 当 try 块中发生 ExceptionType 类型的异常时执行的代码 except: # 不推荐&#xff1a;捕获所有类型的异常&…