其他系列文章导航
Java基础合集
数据结构与算法合集设计模式合集
多线程合集
分布式合集
ES合集
其他系列文章导航
文章目录
前言
一、根据 camp_status 字段分为 6 种情况
1.1 SQL语句
1.2 SQL解释
二、分页 SQL 实现
2.1 SQL语句
2.2 根据 camp_type 区分返回字段
2.3 根据 camp_status 字段分为 6 种情况
三、分页实现
四、总结
在处理数据库查询时,分页是一个常见的需求。
尤其是在处理大量数据时,一次性返回所有结果可能会导致性能问题。
因此,我们需要使用分页查询来限制返回的结果数量。同时,根据特定的条件筛选数据也是非常常见的需求。
在本博客中,我们将探讨如何根据 camp_status 字段分为 6 种情况进行分页查询,并根据 camp_type 字段区分活动类型,返回不同的字段。
我们将使用 SQL 变量来实现这一功能,并通过示例进行详细解释。
要将分页结果按 6 种情况来区分。
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}
这是一个SQL查询,用于从名为BMA_MARKET_CAMP的表中选择和计算数据。下面是对这个查询的逐行解释:
总的来说,这个查询是为了获取与特定用户相关的各种 camp 状态的数量。
这是整个 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#{campStatus,jdbcType=VARCHAR} AND USER_ID = #{userId}
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
解释如下:
综上所述,这个片段的作用是动态生成一个SQL查询的条件,该条件检查CAMP_STATUS是否在给定的campStatus列表中。
SQL部分如下:
SELECT ... FROM ... WHERE CAMP_STATUS in#{campStatus,jdbcType=VARCHAR} ...
这里传入的是一个 list,这样传入即可:
定义一个请求类:
@Data public class CampDataInfoInIndexRequest { ListcampStatusList; private int pageNum; private int pageSize; }
实现一个 PageUtils 。
代码如下:
public class PageUtils { /** * 泛型方法 进行结果的分页 * 当pageNum*pageSize>result.size那么就取result的最后一页数据 * 否则就取相应页的数据 * * @param result * @param pageNum * @param pageSize * @return */ public staticList pageResult(List 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层 ListinfoList = PageUtils.pageResult(info, pageNum, pageSize); PageResultVO pageResultVO = new PageResultVO(); pageResultVO.setTotal(info.size()); pageResultVO.setList(infoList);
在这篇博客中,我们探讨了如何使用SQL实现分页查询,并根据camp_status和camp_type字段进行筛选。
通过使用变量和适当的SQL语法,我们可以根据特定的条件动态地构建查询,从而返回满足我们需求的结果。
通过这种方式,我们可以灵活地构建和执行查询,以满足不同的需求。这对于处理大量数据和实现复杂的筛选条件非常有用。
希望这篇博客能帮助你更好地理解和应用SQL分页查询和筛选功能!