復(fù)雜SQL實現(xiàn)分組分情況分頁查詢代碼實例
前言
在處理數(shù)據(jù)庫查詢時,分頁是一個常見的需求。
尤其是在處理大量數(shù)據(jù)時,一次性返回所有結(jié)果可能會導(dǎo)致性能問題。
因此,我們需要使用分頁查詢來限制返回的結(jié)果數(shù)量。同時,根據(jù)特定的條件篩選數(shù)據(jù)也是非常常見的需求。
在本博客中,我們將探討如何根據(jù) camp_status 字段分為 6 種情況進(jìn)行分頁查詢,并根據(jù) camp_type 字段區(qū)分活動類型,返回不同的字段。
我們將使用 SQL 變量來實現(xiàn)這一功能,并通過示例進(jìn)行詳細(xì)解釋。
一、根據(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)可能是表示“待批準(zhǔn)”或“正在批準(zhǔn)”的狀態(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 語句,下面會細(xì)細(xì)講解!
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ū)分返回字段
- 當(dāng)活動類型為 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_TIME2.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)中,當(dāng)前的元素值會被賦值給名為campStatus的變量。open="("和close=")": 這些指示MyBatis在循環(huán)開始前添加一個左括號(,并在循環(huán)結(jié)束后添加一個右括號)。separator=", ">: 這表示在每次循環(huán)后,我們添加一個逗號,`和一個空格。#{campStatus,jdbcType=VARCHAR}: 這是MyBatis的參數(shù)占位符。它表示我們要將當(dāng)前循環(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 {
/**
* 泛型方法 進(jìn)行結(jié)果的分頁
* 當(dāng)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字段進(jìn)行篩選。
通過使用變量和適當(dāng)?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-03
Hadoop2.X/YARN環(huán)境搭建--CentOS7.0系統(tǒng)配置
Hadoop原本來自于谷歌一款名為MapReduce的編程模型包。谷歌的MapReduce框架可以把一個應(yīng)用程序分解為許多并行計算指令,跨大量的計算節(jié)點運(yùn)行非常巨大的數(shù)據(jù)集。使用該框架的一個典型例子就是在網(wǎng)絡(luò)數(shù)據(jù)上運(yùn)行的搜索算法。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-03
SQLServer與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

