当前位置: 代码网 > it编程>数据库>大数据 > 复杂SQL实现分组分情况分页查询代码实例

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

2024年05月15日 大数据 我要评论
前言在处理数据库查询时,分页是一个常见的需求。尤其是在处理大量数据时,一次性返回所有结果可能会导致性能问题。因此,我们需要使用分页查询来限制返回的结果数量。同时,根据特定的条件筛选数据也是非常常见的需

前言

在处理数据库查询时,分页是一个常见的需求。

尤其是在处理大量数据时,一次性返回所有结果可能会导致性能问题。

因此,我们需要使用分页查询来限制返回的结果数量。同时,根据特定的条件筛选数据也是非常常见的需求。

在本博客中,我们将探讨如何根据 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的表中选择和计算数据。下面是对这个查询的逐行解释:

  • 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,
               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 种情况

解释如下:

  • 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分组分页查询内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

  • navicat如何执行.sql文件

    1.准备好需要执行的.sql文件.sql文件需要注意:每条语句都需要用;作为结束,否则属于语法错误,执行会报错。我们用下面3条语句生成.sql文件测试一下:select sysda…

    2024年05月15日 数据库
  • 数据库librarydb多表查询的操作方法

    数据库librarydb多表查询#全连接、内连接、右连接、左连接1.查询张小东的基本情况和图书借阅情况2.查询借阅状态为借阅的图书的书号和条码3.查询每个读者的姓名、单位、可借天数…

    2024年05月15日 数据库
  • dbeaver导入导出数据库简单图文教程

    右键单击数据库,工具->转储数据库选择要导出的所有项,然后保存到本地。之后新建一个数据库在你想要处理的地方:然后导入刚刚导出的数据库:注意匹配字符集(数据库默认使用gb231…

    2024年05月15日 数据库
  • explain慢查询SQL调优exists的实战

    explain慢查询SQL调优exists的实战

    最近我在公司优化了一些慢查询sql,积累了一些sql调优的实战经验。这篇文章从实战的角度出发,给大家分享一下如何做sql调优。经过两次优化之后,慢sql的性能显... [阅读全文]
  • 使用Navicat连接opengauss数据库完整步骤(详细图文)

    前言折腾了两个小时多才成功连上,在这分享一下我的经验,也仅仅是经验分享,有不足的地方欢迎大家在评论区补充交流准备工作1、需要修改两个文件,一个是postgresql.conf,另一…

    2024年05月15日 数据库
  • 站内群发消息三种不同用户量的数据库设计

    站内群发消息三种不同用户量的数据库设计

    随着web2.0的发展,用户之间的信息交互也变得十分庞大,而且实时性要求越来越高。现在很多sns网站和一部分cms网站都广泛地应用了站内信这一模块,这个看似简单... [阅读全文]

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com