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

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

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

    <!--统计总数-->
    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
			

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

    <!--统计总数-->
    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拒绝,但是不清楚是谁拒绝了,所以导致了我上面分页的时候不能直接查这这个单据表,而是需要级联到审核表,所以去重合并审核记录就存在了难点。但如果在单据表上加一列专门用户存储当前层次的审核结果,这样无论是审核通过,还是拒绝也能知道是那个人拒绝了,就不会存在上面最初的问题了,所以我觉得修改表结构才是上上之法。

       最后送程序员们一句话:“道路千万条,可维护第一条!!!”

       欢迎各位朋友们加入公众号《Java深度编程》,愿我们共同学习,共同成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值