今天遇到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,使用别人的组件,轻松加愉快。

有空,多喝杯茶,泡个脚,打打游戏,早日走上人生巅峰。