欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2023年12月22日 10:14:19   作者:伴川  
最近學(xué)習(xí)了一下SQL的分頁(yè)查詢,總結(jié)了復(fù)雜SQL分組分頁(yè)查詢的方法,這篇文章主要給大家介紹了關(guān)于復(fù)雜SQL實(shí)現(xiàn)分組分情況分頁(yè)查詢的相關(guān)資料,需要的朋友可以參考下

前言

在處理數(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)文章

最新評(píng)論