当前位置: 首页 > news >正文

复杂 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分页查询和筛选功能!


相关文章:

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

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、根据 camp_status 字段分为 6 种情况 1.1 SQL语句 1.2 SQL解释 二、分页 SQL 实现 2.1 SQL语句 2.2 根据 camp_type 区分返…...

JavaScript---如何完美的判断返回对象是否有值

如何判断一个对象为空是我们在开发中经常会遇到的问题&#xff0c;今天我们来聊聊几种经常使用的方法&#xff0c;以及在不同的场景下我们如何去使用。 1. JSON.stringify JSON.stringify 方法可以使对象序列化&#xff0c;转为相应的 JSON 格式。 js 复制代码 const obj {…...

kafka offset sasl加密连接

kafka-tool&#xff08;offset&#xff09; 进行SCRAM连接&#xff0c;直接上图 填写jaas的认证&#xff08;账密 引用包&#xff09;...

Android studio矩形背景颜色以及弧度的设置

在这里插入图片描述 Android的shape中主要设置的属性 corners&#xff1a;用于设置形状的圆角&#xff0c;可以设置圆角的半径、颜色等属性。 stroke&#xff1a;用于设置形状的边框&#xff0c;可以设置边框的宽度、颜色等属性。 padding&#xff1a;用于设置形状的内边距&…...

Acrel-1000DP分布式光伏系统在某重工企业18MW分布式光伏中应用——安科瑞 顾烊宇

摘 要&#xff1a;分布式光伏发电特指在用户场地附近建设&#xff0c;运行方式以用户侧自发自用、余电上网&#xff0c;且在配电系统平衡调节为特征的光伏发电设施&#xff0c;是一种新型的、具有广阔发展前景的发电和能源综合利用方式&#xff0c;它倡导就近发电&#xff0c;就…...

3 python基本语法 - Dict 字典

Python 中字典&#xff08;dict&#xff09;是一种无序的、可变的序列&#xff0c;它的元素以“键值对&#xff08;key-value&#xff09;”的形式存储。相对地&#xff0c;列表&#xff08;list&#xff09;和元组&#xff08;tuple&#xff09;都是有序的序列&#xff0c;它们…...

Magnific AI:彻底改变 AI 生成图像的升级

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

BKP 备份寄存器 RTC 实时时钟-stm32入门

这一章节我们要讲的主要内容是 RTC 实时时钟&#xff0c;对应手册&#xff0c;是第 16 章的位置。 实时时钟这个东西&#xff0c;本质上是一个定时器&#xff0c;但是这个定时器&#xff0c;是专门用来产生年月日时分秒&#xff0c;这种日期和时间信息的。所以学会了 STM32 的…...

1.1 数据结构-数据的表示

文章目录 1.1.1 二元关系及其性质:1.1.1.1 笛卡尔积:1.1.1.2 二元关系:持续更新当中 ....... 1.1.1 二元关系及其性质: 数据的基本单元称为额数据元素,数据是从客观事物的观测中的到的,数据元素并不是鼓励存在的,而是存在密切的联系,也因此才能表示和描述客观事物,数据元素之间…...

UNIX Linux系统 启动PPOCRLabel报错[已放弃 (核心已转储)]

参照官方教程安装后&#xff0c;启动PPOCRLabel报错&#xff1a;[已放弃 (核心已转储)] 官方链接地址&#xff1a;PPOCRLabelv2 $~ PPOCRLabel --lang ch QObject::moveToThread: Current thread (0x561534309430) is not the objects thread (0x56153929eac0). Cannot move to…...

前端开发中的webpack打包工具

前端技术发展迅猛&#xff0c;各种可以提高开发效率的新思想和框架层出不穷&#xff0c;但是它们都有一个共同点&#xff0c;即源代码无法直接运行&#xff0c;必须通过转换后才可以正常运行。webpack是目前主流的打包模块化JavaScript的工具之一。 本章主要涉及的知识点有&am…...

Mybatis配置-数据库厂商标识(databaseIdProvider)

MyBatis可以根据数据库供应商执行不同的语句。多数据库供应商支持是基于映射语句的databaseId属性。MyBatis将加载所有没有databaseId属性或具有与当前数据库匹配的databaseId属性的语句。如果找到具有和不具有databaseId的相同语句&#xff0c;则后者将被丢弃。要启用多供应商…...

【Java】使用递归的方法获取层级关系数据demo

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

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

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

管理类联考——数学——真题篇——按题型分类——充分性判断题——蒙猜A/B

老规矩&#xff0c;看目录&#xff0c;平均3-5题 文章目录 A/B2023真题&#xff08;2023-19&#xff09;-A-选项特点&#xff1a;两个等号&#xff1b;-判断需联立的难易&#xff1a;难&#xff0c;看着感觉需要联立&#xff0c;所以判断联立需要有理论支撑&#xff0c;不然还…...

为什么GRU和LSTM能够缓解梯度消失或梯度爆炸问题?

1、什么是梯度消失&#xff08;gradient vanishing&#xff09;&#xff1f; 参数更新过小&#xff0c;在每次更新时几乎不会移动&#xff0c;导致模型无法学习。 2、什么是梯度爆炸&#xff08;gradient exploding&#xff09;&#xff1f; 参数更新过小大&#xff0c;破坏了…...

【力扣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失去焦点进行校验】 通俗一点就是给输入框加个光标离开当前文本输入框时&#xff0c;然后对当前文本框内容进行校验判断 具体如下&#xff1a; 1.先给文本框加属性 blur“validatePhoneNumber” <el-input v-model“entity.telephone” blur…...

vue3项目引入电子签名(可横屏竖屏)

实现效果&#xff1a;&#xff08;左边横屏&#xff0c;右边竖屏&#xff09; 前言&#xff1a;【使用开源项目smooth-signature 实现签名的功能。Gitee 地址是 &#xff1a;GitHub - linjc/smooth-signature: H5带笔锋手写签名&#xff0c;支持PC端和移动端&#xff0c;任何前…...

mysql中count(*)、count(1)、count(主键)、count(字段)的区别

文章目录 count函数的语义count(主键)count(1)count(*)count(字段)替代方案explain或者show table status中间表或者其他数据库计数 以下分析都是基于 select count(?) from table 这个语句来分析&#xff0c;不带过滤条件。 count函数的语义 count() 是一个聚合函数&#x…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...