MySQL巧用FIND_IN_SET和GROUP_CONCAT函數減少Java代碼量

来源:https://www.cnblogs.com/zerojiang/archive/2018/07/05/9270455.html
-Advertisement-
Play Games

資料庫表簡介:物品表 `id` int(11) '物品id,唯一標識', `name` varchar(255) '物品名稱', `level` int(11) '物品類別等級,禮品包為最高級1,類別為2級,詳細物品為3級', `parentId` int(11) '只有3級詳細物品有上級id', ...


資料庫表簡介:物品表

`id` int(11)    '物品id,唯一標識',
`name` varchar(255)   '物品名稱',
`level` int(11)   '物品類別等級,禮品包為最高級1,類別為2級,詳細物品為3級',
`parentId` int(11)  '只有3級詳細物品有上級id',
`childIds` varchar(255)    '只有1級禮品包級有包含所有3級物品id的字元串,id之間用","隔開',

問題描述:利用sql語句簡化代碼,讓Java代碼可以直接通過jdbc查詢獲取下述集合

  1、根據輸入的1級的id查詢其包含的所有3級物品信息

  2、根據輸入的1級的id查詢其包含的所有3級物品對應的2級物品類別信息

>>>>>>>>>>>>>>>>>>>>>>>>solution>>>>>>>>>>>>>>>>>>>>>>>>>>>

問題1:因為in(childIds)使用針對字元串不能遍歷childIds中所有id,又要避免在Java代碼中先獲取childIds,再split(",")之後迴圈獲取對應good對象。巧妙利用childIds欄位中id用","隔開的特性,所有使用FIND_IN_SET(id,str)函數。

  select g.* from good g where FIND_IN_SET(g.id,(select childIds from good where id =1));    #假設輸入1級id為1

查詢結果:返回1級下所有3級物品集合

>>>>>>>>>>>>>>>>>>>>>>>>solution>>>>>>>>>>>>>>>>>>>>>>>>>>>

問題2:首先利用問題一種所查信息獲取所有的parentId

  select distinct g.parentId from good g where FIND_IN_SET(g.id,(select childIds from good where id =1))

  既然parentId都已經查出來了,按以往辦法先獲取所有parentId集合,再遍歷查詢出所有該1級childIds中的3級物品對應的2級物品類別信息。解決辦法使用GROUP_CONCAT(id)將所查parentId拼接成"3,4,5"這樣的字元串。

先看看GROUP_CONCAT的用法:

select GROUP_CONCAT(L2ids.parentId) from
  (select distinct g.parentId from good g where FIND_IN_SET(g.id,(select childIds from good where id =1))) L2ids

 再使用問題1中的解決辦法查詢所有2級物品信息:

select g.* from good g where FIND_IN_SET(g.id,
  (select GROUP_CONCAT(L2ids.parentId) from
    (select distinct g.parentId from good g where FIND_IN_SET(g.id,(select childIds from good where id =1))) L2ids))

 

總結:在一般的表格帶參數查詢的函數中,可以先想想如何利用sql查詢出所預期的結果,避免大規模的使用Java代碼進行迴圈遍歷。嗯,真香~

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 背景 近年來大數據BigData、人工智慧AI、物聯網Iot等行業發展迅猛,很多人都想要從事大數據技術開發工作,但是,請問要怎麼做,路線是什麼?從哪裡開始學?學哪些?這是一個大問題。對於我自己來說,最近也在學一些大數據開發相關的技術,所以之前整理了一份《大數據技術學習路線》,希望對你有所幫助。 推薦 ...
  • 2、Which two are true about Optimizer Statistics? ❑ A) They do not persist across Instance restarts. ❑ B) They are automatically updated when DDL state ...
  • -- # https://dev.mysql.com/doc/refman/8.0/en/charset-database.html -- create database aixinyz; -- 默認為:latin1,以安裝MYSQL時,默認,當害安裝時選了UTF-8就好了,沒有隻能代碼實現 -- ... ...
  • 一. BloB和Text 1. 合成索引 合成索引可以提高大文本欄位BLOB和Text的查詢性能, 合成索引是在表中增加一個欄位存放散列值,這種技術只能用於精確匹配的查詢,可以使用md5()或sha1,crc23() 來生成散列值, 數值型散列值可以提高存儲效率 。下麵演示下 上面展示了合成索引的用 ...
  • 一.大數據發展背景 現今是數據飛速膨脹的大數據時代,大數據強調3V特征,即Volume(量級)、Varity(種類)和Velocity(速度)。 ·Volume(量級):TB到ZB。 ·Varity(種類):結構化到結構化和非結構化。 ·Velocity(速度):批量數據到流數據處理。 據統計全球8 ...
  • 1.SELECT * FROM CT_FIN_RiskItem--先查詢表,確定數據的確不對(cfstatus第一行缺少)2.select * from CT_FIN_RiskItem as of timestamp to_timestamp('2017-04-20 10:45:03', 'yyyy ...
  • 本機環境系統:Debian 9桌面系統:KDE Plasma ## 官網下載自己系統最新穩定版 https://www.mongodb.com/download-center#community 選擇Debian 9 Linux 64-bit x64 ## 解壓 csr@debian:~$ su r ...
  • Preface We all know that Xtrabackup is a backup tool of percona for innodb or Xtradb.It's usually used to back up whole databases physically.But how t ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...