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

这篇具有很好参考价值的文章主要介绍了复杂 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 overruleCampCount
        FROM BMA_MARKET_CAMP
        WHERE 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,
               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
        <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部分如下:

               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

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,这样传入即可:

复杂 SQL 实现分组分情况分页查询,Java基础合集,sql,数据库,inscode,intellij idea,电视盒子,mybatis,数据结构

定义一个请求类:

@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分页查询和筛选功能!文章来源地址https://www.toymoban.com/news/detail-767374.html


到了这里,关于复杂 SQL 实现分组分情况分页查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mybatis-Plus详解(新建maven项目、查询所有信息、打印SQL日志、实现CRUD(增删改查)、分页、条件查询且分页,前后端分离式开发)

    MyBatis-Plus(opens new window) (简称MP) 是一个MyBatis(opens new window)的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。想查看官网相关内容的化我这里提供了官网地址:https://baomidou.com/ 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般

    2024年02月04日
    浏览(70)
  • java springboot整合MyBatis实现分页查询以及带条件的分页查询

    之前的文章 java springboot整合MyBatis做数据库查询操作操作了springboot整合MyBatis,然后简单做了个按id查询的操作 那么 我们按上文搭建起的环境继续 我们直接在staffDao接口中声明一个分页函数 这里 我们直接在 sql语句中写limit 分页逻辑 参数是方法接收的 这个函数接收两个参数

    2024年02月10日
    浏览(46)
  • Java实现SQL分页

    在日常开发需要对数据进行分页,配置如下 编写配置类  在控制器层可以加上之后使用 了解如下  大致流程如下 在控制器中注入业务层实现方法时需要加上参数IPage 在Service中实现将Ipage传入Mapper文件中  在mapper层中加入参数Ipage实现分页 结果如下 上面是使用mybatis-puls实现分

    2024年02月08日
    浏览(42)
  • ES简单教程(四)使用ElasticsearchRestTemplate多条件分页查询(复杂版)

    TIPS :本文实现类似数据库后台管理系统的多条件分页查询。

    2024年02月11日
    浏览(46)
  • Java分页查询的几种实现方法

    最近在做需求的过程中遇到几个需要分页查询的需求,我也对分页有了较深的了解。分页一般分为两种一种是直接在sql中分页,一种是在内存中分页。本文仅针对内存中分页做记录。 第一种    如果是一个查询接口,向接口中传入page,和size(page默认值1,size默认值10)即可

    2024年02月06日
    浏览(88)
  • 【Java用法】java 不使用sql 实现分页效果

    在Java中,不使用SQL直接实现分页效果通常是指对内存中的数据集合(如List)进行分页操作。以下是一个简单的示例,如何在Java 8及以上版本中使用 Stream API 来对集合进行分页:

    2024年01月18日
    浏览(37)
  • java 整合ES实现文档增删改查(多条件分页查询)

    本文采用ES版本为8.7.1 由于只存储文章,仅用固定索引即可,索引用kibanna直接生成,省略索引部分的增删查步骤 抓取返回信息是因为版本问题无法解析ES返回的正确信息,实际操作成功但是会报错 我这边只需要单索引操作,有需求的可以让前端传过来

    2024年02月13日
    浏览(42)
  • Elasticsearch 分组分页排序查询

    背景:elasticsearch聚合之后进行分页是非常常见的操作   实现思路:         基于es聚合函数bucket_sort、terms和指标聚合cardinality实现 实现方式:(以会员编码分组分页展示会员最近一条时间记录排序为例): 1、查询实现 2、es语句 es查询结果: 3、java获取结果 最终实现分组分页

    2024年02月13日
    浏览(38)
  • SQL Server:分页查询

    ❓ 需求描述:客户端查询数据库数据并显示在表格中。在数据库中进行一次查询,查询结果有1050条记录,但表格单页可显示行上限: 100,这时需要给本次查询记录分配 ? 页用来显示? 可以通过固定公式进行计算(c伪代码): 上一页和下一页业务逻辑(c伪代码) 7.3 SQL Serv

    2024年02月06日
    浏览(42)
  • (Oracle)SQL优化技巧(一):分页查询

    目录 分页查询框架 分页查询注意事项  有序/无序分页 事务带来的影响 分页查询与索引 排序字段索引实验 组合索引实验 利用ROWNUM进行分页查询的方法在各版本都是适用的,11g,12c,19c都可以使用该方法哦。在分享分页查询方法之前,需要先聊下ROWNUM,这玩意儿要是聊不清楚,

    2024年04月11日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包