复杂 SQL 实现分组分情况分页查询

其他系列文章导航

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 变量来实现这一功能,并通过示例进行详细解释。


一、根据 camp_status 字段分为 6 种情况

1.1 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 overruleCampCountFROM BMA_MARKET_CAMPWHERE USER_ID = #{userId}

1.2 SQL解释

这是一个SQL查询,用于从名为BMA_MARKET_CAMP的表中选择和计算数据。下面是对这个查询的逐行解释:

  1. SELECT count(*) AS allCampCount: 这一行计算了BMA_MARKET_CAMP表中的总记录数,并将这个数量命名为allCampCount
  2. SUM(CASE WHEN CAMP_STATUS IN ('31', '32', '35', '55') THEN 1 ELSE 0 END) AS approvalCampCount: 这一行计算了CAMP_STATUS字段值为'31', '32', '35', 或 '55'的总数,并将这个数量命名为approvalCampCount。这些状态可能是表示“待批准”或“正在批准”的状态代码。
  3. SUM(CASE WHEN CAMP_STATUS IN ('40', '41', '56') THEN 1 ELSE 0 END) AS toExecuteCampCount: 这一行计算了CAMP_STATUS字段值为'40', '41', 或 '56'的总数,并将这个数量命名为toExecuteCampCount。这些状态可能是表示“待执行”或“即将执行”的状态代码。
  4. SUM(CASE WHEN CAMP_STATUS IN ('42', '66', '67') THEN 1 ELSE 0 END) AS executeCampCount: 这一行计算了CAMP_STATUS字段值为'42', '66', 或 '67'的总数,并将这个数量命名为executeCampCount。这些状态可能是表示“正在执行”或“已执行”的状态代码。
  5. SUM(CASE WHEN CAMP_STATUS IN ('50', '60') THEN 1 ELSE 0 END) AS completeCampCount: 这一行计算了CAMP_STATUS字段值为'50'或'60'的总数,并将这个数量命名为completeCampCount。这些状态可能是表示“已完成”或“完全完成”的状态代码。
  6. SUM(CASE WHEN CAMP_STATUS IN ('30') THEN 1 ELSE 0 END) AS overruleCampCount: 这一行计算了CAMP_STATUS字段值为'30'的总数,并将这个数量命名为overruleCampCount。这个状态可能是表示“已否决”或“推翻”的状态代码。
  7. FROM BMA_MARKET_CAMP WHERE USER_ID = #{userId}: 最后,指定了数据来源的表是BMA_MARKET_CAMP,并且只选择那些USER_ID字段等于给定参数#{userId}的记录。

总的来说,这个查询是为了获取与特定用户相关的各种 camp 状态的数量。


二、分页 SQL 实现

2.1 SQL语句

这是整个 SQL 语句,下面会细细讲解!

SQL如下:

        SELECT TOUCH_TYPE,t1.CAMP_TYPE,NAME,SMS_CONTENT,CASEWHEN t1.CAMP_TYPE = '0' THENNULLELSESTART_DATE END AS START_DATE,CASEWHEN t1.CAMP_TYPE = '0' THENEXE_START_TIMEELSESTART_TIME END AS START_TIME,CASEWHEN t1.CAMP_TYPE = '0' THENNULLELSEEND_DATE END   AS END_DATE,CASEWHEN t1.CAMP_TYPE = '0' THENNULLELSEEND_TIME END   AS END_TIMEFROM CAMP t1left join CAMP_INFO t2 on t1.ID = t2.CAMP_IDWHERE CAMP_STATUS  in<foreach close=")" collection="campStatus" item="campStatus" open="(" separator=", ">#{campStatus,jdbcType=VARCHAR}</foreach>AND USER_ID = #{userId}

2.2 根据 camp_type 区分返回字段

  • 当活动类型为 0 时,只需要返回 EXE_STRAR_TIME 字段。
  • 其他的活动类型要返回 START_DATE , START_TIME , END_DATE , END_TIME 四个字段。

SQL部分如下:

               CASEWHEN t1.CAMP_TYPE = '0' THENNULLELSESTART_DATE END AS START_DATE,CASEWHEN t1.CAMP_TYPE = '0' THENEXE_START_TIMEELSESTART_TIME END AS START_TIME,CASEWHEN t1.CAMP_TYPE = '0' THENNULLELSEEND_DATE END   AS END_DATE,CASEWHEN t1.CAMP_TYPE = '0' THENNULLELSEEND_TIME END   AS END_TIME

2.3 根据 camp_status 字段分为 6 种情况

解释如下:

  1. WHERE CAMP_STATUS in: 这表示我们要在SQL查询中添加一个条件,即CAMP_STATUS的值必须在给定的列表中。
  2. <foreach ...>: 这是MyBatis的循环语句,用于遍历集合或数组,并动态生成SQL的部分内容。
  3. collection="campStatus": 这表示我们要遍历的集合或数组的名称是campStatus
  4. item="campStatus": 在每次循环中,当前的元素值会被赋值给名为campStatus的变量。
  5. open="(" 和 close=")": 这些指示MyBatis在循环开始前添加一个左括号(,并在循环结束后添加一个右括号)
  6. separator=", ">: 这表示在每次循环后,我们添加一个逗号,`和一个空格。
  7. #{campStatus,jdbcType=VARCHAR}: 这是MyBatis的参数占位符。它表示我们要将当前循环中的campStatus变量的值插入到SQL查询中。jdbcType=VARCHAR指定了参数的类型,这里假设它是VARCHAR类型。

综上所述,这个片段的作用是动态生成一个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;
}

三、分页实现

实现一个 PageUtils 。

代码如下:

public class PageUtils {/*** 泛型方法 进行结果的分页* 当pageNum*pageSize>result.size那么就取result的最后一页数据* 否则就取相应页的数据** @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);

四、总结

在这篇博客中,我们探讨了如何使用SQL实现分页查询,并根据camp_status和camp_type字段进行筛选。

通过使用变量和适当的SQL语法,我们可以根据特定的条件动态地构建查询,从而返回满足我们需求的结果。

通过这种方式,我们可以灵活地构建和执行查询,以满足不同的需求。这对于处理大量数据和实现复杂的筛选条件非常有用。

希望这篇博客能帮助你更好地理解和应用SQL分页查询和筛选功能!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/288151.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零实现一套低代码(保姆级教程) --- 【1】初始化项目,实现左侧组件列表

摘要 低代码作为前端一个比较热门的方向&#xff0c;讨论度或者热度都算是拉满了。 如果你想了解低代码&#xff0c;可以在网上找一些相关的网站。像阿里等公司都有开源的项目和在线体验。 但是因为他们的代码比较牛逼&#xff0c;其实没有那么通俗易懂。 那博主是想&#xff…

vue3中固定格式信息识别功能

1.需求与效果 2.功能代码 // 定义一个函数discern const discern () > {// 定义变量paramsList和paramslet paramsList;let params {};// 将htmlText.value按换行符分割&#xff0c;得到一个数组&#xff0c;每个元素是一行文本paramsList htmlText.value.split(\n);// …

Android排队预约系统(Java+SqLite+ZXing)

自己写的排队预约系统&#xff0c;可改写&#xff0c;添加功能&#xff0c;如管理用户&#xff0c;查询排队人数等功能。(由于是选修课课设&#xff0c;所以写的比较粗糙) 使用方法&#xff1a; 1.使用Android studio导入项目。 2.使用gradle加载build.gradle.kts中的依赖。…

智能优化算法应用:基于适应度相关算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于适应度相关算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于适应度相关算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.适应度相关算法4.实验参数设定5.算法…

芯知识 | 语音芯片支持一线串口和两线串口的作用与应用优势

随着科技的不断进步&#xff0c;语音芯片作为现代电子产品中的核心组件&#xff0c;其功能和性能也在不断提升。其中&#xff0c;语音芯片支持一线串口和两线串口的功能&#xff0c;在实际应用中具有重要的作用和优势。 首先&#xff0c;让我们了解一线串口和两线串口的含义。一…

【实时绘画】krita + comfyUI 实时绘画 儿童海报

1&#xff1a;打开comfyUI 2: 打开krita 打开 cd custom_nodes 输入命令 安装控件 git clone https://github.com/Acly/comfyui-tooling-nodes.git

长短期记忆(LSTM)神经网络-多输入分类

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、部分程序&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&am…

企业特别大的文件用什么传比较快,企业快速传输大文件必备神器

对于企业而言&#xff0c;不论是内部的文件交换、协作、备份&#xff0c;还是外部的文件分享、投标、审计&#xff0c;都需要高效、稳定、安全的文件传输方式。特别是对于一些特别大的文件&#xff0c;如视频、音频、图片、设计图、数据库等&#xff0c;如果传输速度慢、不稳定…

鸿道(Intewell)工业操作系统推动新型工业化时代下的产教融合

为进一步落实推进粤港澳大湾区建设的国家战略&#xff0c;加速新一代信息技术与制造业深度融合&#xff0c;提升控制科学与工程学科建设水平&#xff0c;华南理工大学自动化科学与工程学院召开粤港澳大湾区机器智能产教融合论坛暨控制学科建设研讨会。作为国内新型工业操作系统…

MSSql将test数据库还原为另外一个名字test1的数据库

有时候咱们需要将sqlserver数据库还原成另一个数据库中&#xff0c;如下&#xff1a; 1.备份原数据库。右击原数据库选择如下 2.跳到如下页面&#xff0c;如果目标有记录&#xff0c;那么全部进行删除&#xff0c;然后再添加。在“文件名”文本框中输入有效的路径和文件名&…

数据库故障Waiting for table metadata lock

场景&#xff1a;早上来发现一个程序&#xff0c;链接mysql数据库有点问题&#xff0c;随后排查&#xff0c;因为容器在k8s里面。所以尝试重启了pod没有效果 一、重启pod: 这里是几种在Kubernetes中重启Pod的方法: 删除Pod,利用Deployment重建 kubectl delete pod mypodDepl…

Python之Django开发环境搭建及项目创建

若想使用Django开发网站&#xff0c;需要在电脑上安装Django的开发环境。首先安装Python的开发环境&#xff0c;不同的操作系统有不同的安装方法&#xff0c;关于Python的安装就不再详细阐述了&#xff0c;可参考本博相关文章&#xff0c;除了安装Python之外&#xff0c;我们还…