前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >编程思想之--闹心的分页,去重问题

编程思想之--闹心的分页,去重问题

作者头像
Java深度编程
发布2020-06-10 15:55:00
7420
发布2020-06-10 15:55:00
举报
文章被收录于专栏:Java深度编程

最近遇到一个闹心的问题,在开发审核功能的时候,要查询已审核的记录,肯定是一张单对应多个审核记录啊,所以就显示多条,突然产品要把多余的去点,一张单只显示最近的审核记录,我一开始直接一个循环把多余的去掉了,去掉后发现了一个尴尬的问题,就是前端分分页显示:每页10条,总数多少,共多少页……

假设有总数有6条,每页10条,那么就只有一页,应该应该是6条,当存在一张单多个审核记录的时候去掉多余的就可能只有4条了,然后前端就还显示着总数6条,但是只看到了4条,这就尴尬了。我一开始也想到了减掉总记录数,但是减去总记录数后会影响后面的分页计算,从而得到错误的结果。于是我想到了修改sql。一开始我的sql是:

代码语言:javascript
复制
  <!--统计总数-->
    select  count(t.ID)
        from Assets_Transfer_Audit a
        inner join Assets_Transfer_Apply t on t.FK_CODE = a.ID
        where t.SCHOOL_FK_CODE = #{schoolFkCode}
        and t.DEL_STATUS = 0
        and a.AUDITOR_FK_CODE = #{auditorFkCode}
        and a.LINK_STATUS != 0
        
    <!--分页获取审核记录-->      
        select
          t.ID,
          a.HANDLE_STATUS,
          t.DOCUMENT_NUMBER
        from Assets_Transfer_Apply t
        inner join Assets_Transfer_Audit a on t.FK_CODE = a.ID
        where t.SCHOOL_FK_CODE = #{schoolFkCode}
          and t.DEL_STATUS = 0
          and a.AUDITOR_FK_CODE = #{auditorFkCode}
          and a.LINK_STATUS != 0
         limit 0, 10
代码语言:javascript
复制
			

之后我先想到了将总数去重,然后再查询实际记录去重,于是我的统计sql的count(t.ID) 改成了 count(DISTINCT t.ID),这样就成功的减掉了总数;然而在做分页去重时却遇到了难度,因为DISTINCT只能写在最前面,后面的所有的列都相同才去重,所以就无法将分页的审核记录合并为一条,于是我突发奇想的先查询到真实的记录,组建成临时表,然后再去查临时表并易id分组,这样就成功的去重了,sql如下:

代码语言:javascript
复制
 <!--统计总数-->
    select  count(DISTINCT t.ID)
        from Assets_Transfer_Audit a
        inner join Assets_Transfer_Apply t on t.FK_CODE = a.ID
        where t.SCHOOL_FK_CODE = #{schoolFkCode}
        and t.DEL_STATUS = 0
        and a.AUDITOR_FK_CODE = #{auditorFkCode}
        and a.LINK_STATUS != 0
        
    <!--分页获取审核记录-->      
    select * from(
      select
        t.ID,
        a.HANDLE_STATUS,
        a.LINK_STATUS
        from Assets_Transfer_Apply t
            inner join Assets_Transfer_Audit a on t.FK_CODE = a.ID
            where t.SCHOOL_FK_CODE =  #{schoolFkCode}
            and a.AUDITOR_FK_CODE = #{auditorFkCode}      
            ORDER BY a.LINK_STATUS DESC
       ) temp GROUP BY temp.ID  DESC  limit 0, 10

就这样完美的解决了这个问题,但是后面我又考虑到此种方法过于繁琐,不利于维护,扩展,于是我还是坚持初衷的想要改表结构,我原先的表结构如下:

从上可以看出,表设计不够完善,因为审核拒绝后单据状态就变为6拒绝,但是不清楚是谁拒绝了,所以导致了我上面分页的时候不能直接查这这个单据表,而是需要级联到审核表,所以去重合并审核记录就存在了难点。但如果在单据表上加一列专门用户存储当前层次的审核结果,这样无论是审核通过,还是拒绝也能知道是那个人拒绝了,就不会存在上面最初的问题了,所以我觉得修改表结构才是上上之法。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java深度编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档