最近遇到一个闹心的问题,在开发审核功能的时候,要查询已审核的记录,肯定是一张单对应多个审核记录啊,所以就显示多条,突然产品要把多余的去点,一张单只显示最近的审核记录,我一开始直接一个循环把多余的去掉了,去掉后发现了一个尴尬的问题,就是前端分分页显示:每页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深度编程》,愿我们共同学习,共同成长!