复杂 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
的表中选择和计算数据。下面是对这个查询的逐行解释:
SELECT count(*) AS allCampCount
: 这一行计算了BMA_MARKET_CAMP
表中的总记录数,并将这个数量命名为allCampCount
。SUM(CASE WHEN CAMP_STATUS IN ('31', '32', '35', '55') THEN 1 ELSE 0 END) AS approvalCampCount
: 这一行计算了CAMP_STATUS
字段值为'31', '32', '35', 或 '55'的总数,并将这个数量命名为approvalCampCount
。这些状态可能是表示“待批准”或“正在批准”的状态代码。SUM(CASE WHEN CAMP_STATUS IN ('40', '41', '56') THEN 1 ELSE 0 END) AS toExecuteCampCount
: 这一行计算了CAMP_STATUS
字段值为'40', '41', 或 '56'的总数,并将这个数量命名为toExecuteCampCount
。这些状态可能是表示“待执行”或“即将执行”的状态代码。SUM(CASE WHEN CAMP_STATUS IN ('42', '66', '67') THEN 1 ELSE 0 END) AS executeCampCount
: 这一行计算了CAMP_STATUS
字段值为'42', '66', 或 '67'的总数,并将这个数量命名为executeCampCount
。这些状态可能是表示“正在执行”或“已执行”的状态代码。SUM(CASE WHEN CAMP_STATUS IN ('50', '60') THEN 1 ELSE 0 END) AS completeCampCount
: 这一行计算了CAMP_STATUS
字段值为'50'或'60'的总数,并将这个数量命名为completeCampCount
。这些状态可能是表示“已完成”或“完全完成”的状态代码。SUM(CASE WHEN CAMP_STATUS IN ('30') THEN 1 ELSE 0 END) AS overruleCampCount
: 这一行计算了CAMP_STATUS
字段值为'30'的总数,并将这个数量命名为overruleCampCount
。这个状态可能是表示“已否决”或“推翻”的状态代码。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 种情况
解释如下:
WHERE CAMP_STATUS in
: 这表示我们要在SQL查询中添加一个条件,即CAMP_STATUS
的值必须在给定的列表中。<foreach ...>
: 这是MyBatis的循环语句,用于遍历集合或数组,并动态生成SQL的部分内容。collection="campStatus"
: 这表示我们要遍历的集合或数组的名称是campStatus
。item="campStatus"
: 在每次循环中,当前的元素值会被赋值给名为campStatus
的变量。open="("
和close=")"
: 这些指示MyBatis在循环开始前添加一个左括号(
,并在循环结束后添加一个右括号)
。separator=", ">: 这表示在每次循环后,我们添加一个逗号
,`和一个空格。#{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分页查询和筛选功能!
相关文章:

复杂 SQL 实现分组分情况分页查询
其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、根据 camp_status 字段分为 6 种情况 1.1 SQL语句 1.2 SQL解释 二、分页 SQL 实现 2.1 SQL语句 2.2 根据 camp_type 区分返…...
JavaScript---如何完美的判断返回对象是否有值
如何判断一个对象为空是我们在开发中经常会遇到的问题,今天我们来聊聊几种经常使用的方法,以及在不同的场景下我们如何去使用。 1. JSON.stringify JSON.stringify 方法可以使对象序列化,转为相应的 JSON 格式。 js 复制代码 const obj {…...

kafka offset sasl加密连接
kafka-tool(offset) 进行SCRAM连接,直接上图 填写jaas的认证(账密 引用包)...

Android studio矩形背景颜色以及弧度的设置
在这里插入图片描述 Android的shape中主要设置的属性 corners:用于设置形状的圆角,可以设置圆角的半径、颜色等属性。 stroke:用于设置形状的边框,可以设置边框的宽度、颜色等属性。 padding:用于设置形状的内边距&…...

Acrel-1000DP分布式光伏系统在某重工企业18MW分布式光伏中应用——安科瑞 顾烊宇
摘 要:分布式光伏发电特指在用户场地附近建设,运行方式以用户侧自发自用、余电上网,且在配电系统平衡调节为特征的光伏发电设施,是一种新型的、具有广阔发展前景的发电和能源综合利用方式,它倡导就近发电,就…...

3 python基本语法 - Dict 字典
Python 中字典(dict)是一种无序的、可变的序列,它的元素以“键值对(key-value)”的形式存储。相对地,列表(list)和元组(tuple)都是有序的序列,它们…...

Magnific AI:彻底改变 AI 生成图像的升级
在我最近与 Magnific AI 的讨论中,我不仅感到惊讶,而且对该工具提供的质量和可能性着迷。我发现 Magnific AI 能够转换人工智能生成的图像(这些图像通常只能以低分辨率提供),尤其令人印象深刻,不仅在可打印…...

BKP 备份寄存器 RTC 实时时钟-stm32入门
这一章节我们要讲的主要内容是 RTC 实时时钟,对应手册,是第 16 章的位置。 实时时钟这个东西,本质上是一个定时器,但是这个定时器,是专门用来产生年月日时分秒,这种日期和时间信息的。所以学会了 STM32 的…...
1.1 数据结构-数据的表示
文章目录 1.1.1 二元关系及其性质:1.1.1.1 笛卡尔积:1.1.1.2 二元关系:持续更新当中 ....... 1.1.1 二元关系及其性质: 数据的基本单元称为额数据元素,数据是从客观事物的观测中的到的,数据元素并不是鼓励存在的,而是存在密切的联系,也因此才能表示和描述客观事物,数据元素之间…...
UNIX Linux系统 启动PPOCRLabel报错[已放弃 (核心已转储)]
参照官方教程安装后,启动PPOCRLabel报错:[已放弃 (核心已转储)] 官方链接地址:PPOCRLabelv2 $~ PPOCRLabel --lang ch QObject::moveToThread: Current thread (0x561534309430) is not the objects thread (0x56153929eac0). Cannot move to…...

前端开发中的webpack打包工具
前端技术发展迅猛,各种可以提高开发效率的新思想和框架层出不穷,但是它们都有一个共同点,即源代码无法直接运行,必须通过转换后才可以正常运行。webpack是目前主流的打包模块化JavaScript的工具之一。 本章主要涉及的知识点有&am…...
Mybatis配置-数据库厂商标识(databaseIdProvider)
MyBatis可以根据数据库供应商执行不同的语句。多数据库供应商支持是基于映射语句的databaseId属性。MyBatis将加载所有没有databaseId属性或具有与当前数据库匹配的databaseId属性的语句。如果找到具有和不具有databaseId的相同语句,则后者将被丢弃。要启用多供应商…...

【Java】使用递归的方法获取层级关系数据demo
使用递归来完善各种业务数据的层级关系的获取 引言:在Java开发中,我们通常会遇到层层递进的关系型数据的获取问题,有时是树状解构,或金字塔结构,怎么描述都行,错综复杂的关系在程序中还是可以理清的。 这…...

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

管理类联考——数学——真题篇——按题型分类——充分性判断题——蒙猜A/B
老规矩,看目录,平均3-5题 文章目录 A/B2023真题(2023-19)-A-选项特点:两个等号;-判断需联立的难易:难,看着感觉需要联立,所以判断联立需要有理论支撑,不然还…...
为什么GRU和LSTM能够缓解梯度消失或梯度爆炸问题?
1、什么是梯度消失(gradient vanishing)? 参数更新过小,在每次更新时几乎不会移动,导致模型无法学习。 2、什么是梯度爆炸(gradient exploding)? 参数更新过小大,破坏了…...
【力扣100】146.LRU缓存
添加链接描述 class DLinkedNode:def __init__(self, key0, value0):self.key keyself.value valueself.prev Noneself.next Noneclass LRUCache:def __init__(self, capacity: int):self.cache dict()# 使用伪头部和伪尾部节点 self.head DLinkedNode()self.tail D…...

【Vue中给输入框加入js验证_blur失去焦点进行校验】
【Vue中给输入框加入js验证_blur失去焦点进行校验】 通俗一点就是给输入框加个光标离开当前文本输入框时,然后对当前文本框内容进行校验判断 具体如下: 1.先给文本框加属性 blur“validatePhoneNumber” <el-input v-model“entity.telephone” blur…...

vue3项目引入电子签名(可横屏竖屏)
实现效果:(左边横屏,右边竖屏) 前言:【使用开源项目smooth-signature 实现签名的功能。Gitee 地址是 :GitHub - linjc/smooth-signature: H5带笔锋手写签名,支持PC端和移动端,任何前…...
mysql中count(*)、count(1)、count(主键)、count(字段)的区别
文章目录 count函数的语义count(主键)count(1)count(*)count(字段)替代方案explain或者show table status中间表或者其他数据库计数 以下分析都是基于 select count(?) from table 这个语句来分析,不带过滤条件。 count函数的语义 count() 是一个聚合函数&#x…...
KubeSphere 容器平台高可用:环境搭建与可视化操作指南
Linux_k8s篇 欢迎来到Linux的世界,看笔记好好学多敲多打,每个人都是大神! 题目:KubeSphere 容器平台高可用:环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...