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.pswp.cn/news/905490.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905490.shtml
英文地址,請注明出處:http://en.pswp.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;捕獲所有類型的異常&…