今天遇到1个老系统的bug,既然没人管,就我亲手来杀死它。
分页查询,通常分2次查询,先count,再list。
list查询
select code,group_concat(three_type)
from table_A
left join table_B
group by code;
一般来说,list查询不需要使用group,但是这个sql为了把three_type组合起来,使用了group_concat这个函数。
因此,使用group没问题。
count查询
secect count(*)
from table_A
left join table_B;
count查询,不需要group。
天坑出现了,count查询总条数47,显示5页。
但是,第4页只有8条,第5页没有数据。
因此,数据只有38条,最多只有4页。
为啥呢?
left-join 导致,A表 条数变多了,A-B 存在 1对多的情况。
list那个查询,为了three-type字段组合,恰好使用了 group by去重了,
写这个代码的哥们,估计也不清楚。
而count查询,是没有去重的,因此 数据不一致了。
改进办法:secect count(distinct(code))。
------------------------------------建议----------------------------------------
web开发,分页查询太常见了,维护list和count 2个查询,太费事了。
查询条件变更,得更改2个地方。
因此,只需要维护list 1个sql。
count的sql,截取 list的sql,再加上count。
比如:
list查询,secect(*) from user where code =1;
那么对应的count查询就是,select count(*) + (list查询的后半部分,从from开始,)
count查询这个sql执行,可以写1个mybatis拦截器,网上一搜一大把。
或者 可以使用 mybatis PageHelper这个插件,网友写的,一直有维护。
------------------------------------动动脑子----------------------------------------
多动动脑子,少些重复代码,少出bug,使用别人的组件,轻松加愉快。
有空,多喝杯茶,泡个脚,打打游戏,早日走上人生巅峰。