復(fù)雜SQL實現(xiàn)分組分情況分頁查詢代碼實例
前言
在處理數(shù)據(jù)庫查詢時,分頁是一個常見的需求。
尤其是在處理大量數(shù)據(jù)時,一次性返回所有結(jié)果可能會導(dǎo)致性能問題。
因此,我們需要使用分頁查詢來限制返回的結(jié)果數(shù)量。同時,根據(jù)特定的條件篩選數(shù)據(jù)也是非常常見的需求。
在本博客中,我們將探討如何根據(jù) camp_status 字段分為 6 種情況進行分頁查詢,并根據(jù) camp_type 字段區(qū)分活動類型,返回不同的字段。
我們將使用 SQL 變量來實現(xiàn)這一功能,并通過示例進行詳細解釋。
一、根據(jù) camp_status 字段分為 6 種情況
1.1 SQL語句
要將分頁結(jié)果按 6 種情況來區(qū)分。
SQL如下:
SELECT count(*) AS allCampCount, SUM(CASE WHEN CAMP_STATUS IN ('31', '32', '35', '55') THEN 1 ELSE 0 END) AS approvalCampCount, SUM(CASE WHEN CAMP_STATUS IN ('40', '41', '56') THEN 1 ELSE 0 END) AS toExecuteCampCount, SUM(CASE WHEN CAMP_STATUS IN ('42', '66', '67') THEN 1 ELSE 0 END) AS executeCampCount, SUM(CASE WHEN CAMP_STATUS IN ('50', '60') THEN 1 ELSE 0 END) AS completeCampCount, SUM(CASE WHEN CAMP_STATUS IN ('30') THEN 1 ELSE 0 END) AS overruleCampCount FROM BMA_MARKET_CAMP WHERE USER_ID = #{userId}
1.2 SQL解釋
這是一個SQL查詢,用于從名為BMA_MARKET_CAMP
的表中選擇和計算數(shù)據(jù)。下面是對這個查詢的逐行解釋:
SELECT count(*) AS allCampCount
: 這一行計算了BMA_MARKET_CAMP
表中的總記錄數(shù),并將這個數(shù)量命名為allCampCount
。SUM(CASE WHEN CAMP_STATUS IN ('31', '32', '35', '55') THEN 1 ELSE 0 END) AS approvalCampCount
: 這一行計算了CAMP_STATUS
字段值為'31', '32', '35', 或 '55'的總數(shù),并將這個數(shù)量命名為approvalCampCount
。這些狀態(tài)可能是表示“待批準”或“正在批準”的狀態(tài)代碼。SUM(CASE WHEN CAMP_STATUS IN ('40', '41', '56') THEN 1 ELSE 0 END) AS toExecuteCampCount
: 這一行計算了CAMP_STATUS
字段值為'40', '41', 或 '56'的總數(shù),并將這個數(shù)量命名為toExecuteCampCount
。這些狀態(tài)可能是表示“待執(zhí)行”或“即將執(zhí)行”的狀態(tài)代碼。SUM(CASE WHEN CAMP_STATUS IN ('42', '66', '67') THEN 1 ELSE 0 END) AS executeCampCount
: 這一行計算了CAMP_STATUS
字段值為'42', '66', 或 '67'的總數(shù),并將這個數(shù)量命名為executeCampCount
。這些狀態(tài)可能是表示“正在執(zhí)行”或“已執(zhí)行”的狀態(tài)代碼。SUM(CASE WHEN CAMP_STATUS IN ('50', '60') THEN 1 ELSE 0 END) AS completeCampCount
: 這一行計算了CAMP_STATUS
字段值為'50'或'60'的總數(shù),并將這個數(shù)量命名為completeCampCount
。這些狀態(tài)可能是表示“已完成”或“完全完成”的狀態(tài)代碼。SUM(CASE WHEN CAMP_STATUS IN ('30') THEN 1 ELSE 0 END) AS overruleCampCount
: 這一行計算了CAMP_STATUS
字段值為'30'的總數(shù),并將這個數(shù)量命名為overruleCampCount
。這個狀態(tài)可能是表示“已否決”或“推翻”的狀態(tài)代碼。FROM BMA_MARKET_CAMP WHERE USER_ID = #{userId}
: 最后,指定了數(shù)據(jù)來源的表是BMA_MARKET_CAMP
,并且只選擇那些USER_ID
字段等于給定參數(shù)#{userId}
的記錄。
總的來說,這個查詢是為了獲取與特定用戶相關(guān)的各種 camp 狀態(tài)的數(shù)量。
二、分頁 SQL 實現(xiàn)
2.1 SQL語句
這是整個 SQL 語句,下面會細細講解!
SQL如下:
SELECT TOUCH_TYPE, t1.CAMP_TYPE, NAME, SMS_CONTENT, CASE WHEN t1.CAMP_TYPE = '0' THEN NULL ELSE START_DATE END AS START_DATE, CASE WHEN t1.CAMP_TYPE = '0' THEN EXE_START_TIME ELSE START_TIME END AS START_TIME, CASE WHEN t1.CAMP_TYPE = '0' THEN NULL ELSE END_DATE END AS END_DATE, CASE WHEN t1.CAMP_TYPE = '0' THEN NULL ELSE END_TIME END AS END_TIME FROM CAMP t1 left join CAMP_INFO t2 on t1.ID = t2.CAMP_ID WHERE CAMP_STATUS in <foreach close=")" collection="campStatus" item="campStatus" open="(" separator=", "> #{campStatus,jdbcType=VARCHAR} </foreach> AND USER_ID = #{userId}
2.2 根據(jù) camp_type 區(qū)分返回字段
- 當活動類型為 0 時,只需要返回 EXE_STRAR_TIME 字段。
- 其他的活動類型要返回 START_DATE , START_TIME , END_DATE , END_TIME 四個字段。
SQL部分如下:
CASE WHEN t1.CAMP_TYPE = '0' THEN NULL ELSE START_DATE END AS START_DATE, CASE WHEN t1.CAMP_TYPE = '0' THEN EXE_START_TIME ELSE START_TIME END AS START_TIME, CASE WHEN t1.CAMP_TYPE = '0' THEN NULL ELSE END_DATE END AS END_DATE, CASE WHEN t1.CAMP_TYPE = '0' THEN NULL ELSE END_TIME END AS END_TIME
2.3 根據(jù) camp_status 字段分為 6 種情況
解釋如下:
WHERE CAMP_STATUS in
: 這表示我們要在SQL查詢中添加一個條件,即CAMP_STATUS
的值必須在給定的列表中。<foreach ...>
: 這是MyBatis的循環(huán)語句,用于遍歷集合或數(shù)組,并動態(tài)生成SQL的部分內(nèi)容。collection="campStatus"
: 這表示我們要遍歷的集合或數(shù)組的名稱是campStatus
。item="campStatus"
: 在每次循環(huán)中,當前的元素值會被賦值給名為campStatus
的變量。open="("
和close=")"
: 這些指示MyBatis在循環(huán)開始前添加一個左括號(
,并在循環(huán)結(jié)束后添加一個右括號)
。separator=", ">: 這表示在每次循環(huán)后,我們添加一個逗號
,`和一個空格。#{campStatus,jdbcType=VARCHAR}
: 這是MyBatis的參數(shù)占位符。它表示我們要將當前循環(huán)中的campStatus
變量的值插入到SQL查詢中。jdbcType=VARCHAR
指定了參數(shù)的類型,這里假設(shè)它是VARCHAR類型。
綜上所述,這個片段的作用是動態(tài)生成一個SQL查詢的條件,該條件檢查CAMP_STATUS
是否在給定的campStatus
列表中。
SQL部分如下:
SELECT ... FROM ... WHERE CAMP_STATUS in <foreach close=")" collection="campStatus" item="campStatus" open="(" separator=", "> #{campStatus,jdbcType=VARCHAR} </foreach> ...
這里傳入的是一個 list,這樣傳入即可:
定義一個請求類:
@Data public class CampDataInfoInIndexRequest { List<Integer> campStatusList; private int pageNum; private int pageSize; }
三、分頁實現(xiàn)
實現(xiàn)一個 PageUtils 。
代碼如下:
public class PageUtils { /** * 泛型方法 進行結(jié)果的分頁 * 當pageNum*pageSize>result.size那么就取result的最后一頁數(shù)據(jù) * 否則就取相應(yīng)頁的數(shù)據(jù) * * @param result * @param pageNum * @param pageSize * @return */ public static <T> List<T> pageResult(List<T> result, Integer pageNum, Integer pageSize) { if (Objects.isNull(result) || result.size() == 0) { return result; } int maxSize = result.size(); if (maxSize < pageNum * pageSize + pageSize) { int maxPage = maxSize / pageSize; return result.subList(maxPage * pageSize, result.size()); } return result.subList(pageNum * pageSize, (pageNum + 1) * pageSize); } }
再通過一個 PageResultVO 返回即可。
代碼如下:
@Data public class PageResultVO { private Integer total; private List<?> list; } //ServiceImpl層 List<CampInfoVO> infoList = PageUtils.pageResult(info, pageNum, pageSize); PageResultVO pageResultVO = new PageResultVO(); pageResultVO.setTotal(info.size()); pageResultVO.setList(infoList);
四、總結(jié)
在這篇博客中,我們探討了如何使用SQL實現(xiàn)分頁查詢,并根據(jù)camp_status和camp_type字段進行篩選。
通過使用變量和適當?shù)腟QL語法,我們可以根據(jù)特定的條件動態(tài)地構(gòu)建查詢,從而返回滿足我們需求的結(jié)果。
通過這種方式,我們可以靈活地構(gòu)建和執(zhí)行查詢,以滿足不同的需求。這對于處理大量數(shù)據(jù)和實現(xiàn)復(fù)雜的篩選條件非常有用。
到此這篇關(guān)于復(fù)雜SQL實現(xiàn)分組分情況分頁查詢的文章就介紹到這了,更多相關(guān)復(fù)雜SQL分組分頁查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nebula?Graph解決風(fēng)控業(yè)務(wù)實踐
本文主要講述?Nebula?Graph?是如何通過眾安保險的選型,以及?Nebula?Graph?又是如何落地到具體業(yè)務(wù)場景幫助眾安保險解決風(fēng)控問題,有需要的朋友可以借鑒參考下2022-03-03Hadoop2.X/YARN環(huán)境搭建--CentOS7.0系統(tǒng)配置
Hadoop原本來自于谷歌一款名為MapReduce的編程模型包。谷歌的MapReduce框架可以把一個應(yīng)用程序分解為許多并行計算指令,跨大量的計算節(jié)點運行非常巨大的數(shù)據(jù)集。使用該框架的一個典型例子就是在網(wǎng)絡(luò)數(shù)據(jù)上運行的搜索算法。2014-08-08掌握SQL Server數(shù)據(jù)庫快照的工作原理
2008-01-01關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫概述與優(yōu)缺點對比
這篇文章介紹了關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫概述與優(yōu)缺點對比,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03比較SQL Server與Oracle、DB2數(shù)據(jù)庫的一些知識
本文比較大型數(shù)據(jù)庫SQL Server與Oracle、DB2的一些不同應(yīng)用之處。對于以后開發(fā)選擇什么樣的數(shù)據(jù)庫。2010-03-03SQLServer與Oracle常用函數(shù)實例對比匯總
這篇文章主要介紹了SQLServer與Oracle常用函數(shù)對比,需要的朋友可以參考下2014-06-06利用DataSet部分功能實現(xiàn)網(wǎng)站登錄
這篇文章主要介紹了利用DataSet部分功能實現(xiàn)網(wǎng)站登錄 ,需要的朋友可以參考下2017-05-05淺談關(guān)系型數(shù)據(jù)庫中的約束及應(yīng)用場景
這篇文章主要介紹了淺談關(guān)系型數(shù)據(jù)庫中的約束及應(yīng)用場景,關(guān)系型數(shù)據(jù)庫是一種廣泛應(yīng)用的數(shù)據(jù)庫類型,它的核心是基于關(guān)系模型的結(jié)構(gòu)化數(shù)據(jù)存儲和管理,在關(guān)系型數(shù)據(jù)庫中,約束是一種重要的概念,它可以幫助我們保證數(shù)據(jù)的完整性和一致性,需要的朋友可以參考下2023-07-07