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