复杂 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.mzph.cn/news/234458.shtml

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

相关文章

Unity中Shader测试常用的UGUI功能简介

文章目录 前言一、锚点1、锚点快捷修改位置2、使用Anchor Presets快捷修改3、Anchor Presets界面按下 Shift 可以快捷修改锚点和中心点位置4、Anchor Presets界面按下 Alt 可以快捷修改锚点位置、UI对象位置 和 长宽大小 二、Canvas画布1、UGUI中 Transform 变成了 Rect Transf…

openssl数据压缩

介绍 数据压缩是将原有数据通过某种压缩算法计算得到相对数据量小的过程。这种过程是可逆的&#xff0c;即能通过压缩后的数据恢复出原数据。数据压缩能够节省存储空间&#xff0c;减轻网络负载。 在即需要加密又需要压缩的情况下&#xff0c;必须先压缩再加密&#xff0c;次…

Linux 操作系统(查看文件内容)

cat 格式&#xff1a;cat [选项]...[文件]... 说明&#xff1a;把多个文件连接后输出到标准输出&#xff08;屏幕&#xff09;或者加”> 文件名” 输出到另一个文件中 常用选项&#xff1a; -b或—number-noblank: 从1开始对所有非空输出行进行编号 -n或—number: 从1开始所…

网络协议小记

一、TCP/IP协议 作为一个小萌新&#xff0c;当然我无法将tcp/ip协议的大部分江山和盘托出&#xff0c;但是其中很多面试可能问到的知识&#xff0c;我觉得有必要总结一下&#xff01; 首先&#xff0c;在学习tcp/ip协议之前&#xff0c;我们必须搞明白什么是tcp/ip协议。 1、…

6. 3 lambda表达式

6.3 lambda表达式 指定时间间隔完成工作&#xff0c;该工作放在了ActionListener中的action performed 方法中&#xff1b;work类继承上述类&#xff0c;构造work类实例 定制比较器完成排序&#xff0c;定义一个长度比较类&#xff0c;再传给sort&#xff1b;实现基于长度排…

Web地图开发,在vue3中引入高德地图API

在vue3中引入高德地图API要实现的功能 设置地图的显示样式实现点击地图添加标记、点击地图获取详细地址和经纬度输入框搜索获取相关地区提示&#xff08;下拉框&#xff0c;选中后进行标记&#xff0c;视角移动到相对位置&#xff09;输入框输入内容&#xff0c;回车获取详细地…

架构设计系列之前端架构和后端架构的区别和联系

前端架构和后端架构都是软件系统中最关键的架构层&#xff0c;负责处理不同方面的任务和逻辑&#xff0c;两者之间是存在一些区别和联系的&#xff0c;我会从以下几个方面来阐述&#xff1a; 一、定位和职责 前端架构 主要关注用户界面和用户体验&#xff0c;负责处理用户与…

打造中国人自己的GPTs,百度灵境矩阵升级为智能体平台

12月18日&#xff0c;百度「灵境矩阵」平台全新升级为「文心大模型智能体平台」。灵境矩阵基于文心大模型&#xff0c;为开发者提供多样化的开发方式&#xff0c;支持广大开发者根据自身行业领域、应用场景&#xff0c;选取多样化的开发方式&#xff0c;打造大模型时代的原生应…

关于我对归纳偏置(inductive bias)的概念和应用的详细总结

归纳偏置&#xff08;inductive bias&#xff09; 1.归纳偏置&#xff08;inductive bias&#xff09;的概念2.归纳偏置&#xff08;inductive bias&#xff09;的应用 1.归纳偏置&#xff08;inductive bias&#xff09;的概念 归纳偏置&#xff08;inductive bias&#xff0…

贪吃蛇(二)绘制地图

绘制地图主要是考察基础的循环和分支控制&#xff0c;视频没看完&#xff0c;自己写了一下。 绘制一个基础地图 #include"curses.h" void cursesinit() {initscr();keypad(stdscr,1); }void mapinit() {int row;int col;for(row 0;row < 20;row){if(row 0 || …

如何在 FastAPI 中设置定时任务:完全指南

Web 应用程序开发中&#xff0c;及时高效处理常规任务至关重要&#xff0c;包括定时收集数据或管理任务计划。针对强大且性能卓越的 FastAPI 框架&#xff0c;我们可以通过几种策略来管理这些必要的定时任务。 实现 FastAPI 中的定时任务 本指南将探讨在 FastAPI 环境中管理定…

工业6轴机械臂运动学逆解(解析解)

工业6轴机械臂运动学逆解&#xff08;解析解&#xff09; 通常工业机械臂采用6旋转轴串连的形式&#xff0c;保证了灵活性&#xff0c;但为其运动学逆解&#xff08;即已知机械臂末端的位姿 P P P&#xff0c;求机械臂各个旋转轴的旋转角&#xff09;带来了较大的困难&#xff…

面试题总结(十五)【ARMstm32】【华清远见西安中心】

ARM Cortex-M,Cortex-R,Cortex-A的区别和差异是什么&#xff1f; ARM Cortex-M&#xff0c;Cortex-R和Cortex-A是ARM架构下的不同处理器系列&#xff0c;针对不同的应用领域和需求进行了优化和设计。它们之间的区别和差异主要体现在以下几个方面&#xff1a; 1. 应用领域&#…

倒计数器:CountDownLatch

CountDownLatch 是 Java 中用于多线程编程的一个同步工具。 它允许一个或多个线程等待其他线程执行完特定操作后再继续执行。 CountDownLatch 通过一个计数器来实现&#xff0c; 该计数器初始化为一个正整数&#xff0c;每当一个线程完成了指定操作&#xff0c;计数器就会减一。…

Apache CouchDB 垂直权限绕过漏洞 CVE-2017-12635 已亲自复现

Apache CouchDB 垂直权限绕过漏洞 CVE-2017-12635 已亲自复现 漏洞名称影响版本影响版本 漏洞复现环境搭建漏洞利用 总结 漏洞名称 影响版本 Apache CouchDB是一个开源的NoSQL数据库&#xff0c;专注于易用性和成为“完全拥抱web的数据库”。它是一个使用JSON作为数据存储格式…

【深度学习】序列生成模型(六):评价方法计算实例:计算ROUGE-N得分【理论到程序】

文章目录 一、BLEU-N得分&#xff08;Bilingual Evaluation Understudy&#xff09;二、ROUGE-N得分&#xff08;Recall-Oriented Understudy for Gisting Evaluation&#xff09;1. 定义2. 计算N1N2 3. 程序 给定一个生成序列“The cat sat on the mat”和两个参考序列“The c…

JavaSE 搜索树

目录 1 概念2 操作2.1 查找2.2 插入2.3 删除 3 性能分析4 和 java 类集的关系 1 概念 二叉搜索树 又称 二叉排序树&#xff0c;它是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值&#xff1b;若它…

js使用promise对象达到promise waiting

async getInfoFormName() {return new Promise((resolve, reject) > {let infoForm: string;if (this.showBox "basic-info-box") {infoForm "basicInfoForm";} else {infoForm "extendInfoForm";}resolve(infoForm);});} 使用这个Priomi…

[Java][File]文件的创建与删除

对一个File类型的对象而言 1.创建一个新的空的文件 createNewFile 2.制作单级文件夹 mkdir 3.制作多级文件夹 mkdirs 4.删除文件、空文件夹 delete 注意&#xff1a;这个方法不会走回收站的 import java.io.File; import java.io.IOException;public class Main{public static …

Logistic Regression逻辑线性回归(基于diabetes数据集)

目录 介绍&#xff1a; 1、Confusion Matrix&#xff1a; 2、ROC&#xff08;Receiver Operating Characteristic&#xff09; 一、数据处理 二、建模 三、 confusion_matrix 四、 ROC&#xff08;Receiver Operating Characteristic&#xff09; 介绍&#xff1a; L…