亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

復(fù)雜SQL實現(xiàn)分組分情況分頁查詢代碼實例

 更新時間:2023年12月22日 10:14:19   作者:伴川  
最近學(xué)習(xí)了一下SQL的分頁查詢,總結(jié)了復(fù)雜SQL分組分頁查詢的方法,這篇文章主要給大家介紹了關(guān)于復(fù)雜SQL實現(xiàn)分組分情況分頁查詢的相關(guā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)文章

最新評論