1、场景:管理台列表查询莫名出现重复数据,第一页的最后几条数据在第二页的最上面也出现了。
select c.* from (select a.* from a where xxx union select b.* from b where xxx ) c where xxx order by c.acct_date desc limit pageSize,pageNum
2、排查:查看SQL语句,里面用到了一个union,然后又用到了order by日期字段,mapper层又用来mybatis的分页插件pageHelper。经过查询发现是因为order by后的字段不是唯一字段,导致分页查询出现错乱。(具体底层原因有兴趣的可以自行查看)
3、解决:order by日期后,加上一个能确定唯一的字段,如id之类的。测试后发现确实解决问题。
select c.* from (select a.* from a where xxx union select b.* from b where xxx ) c where xxx order by c.acct_date desc,c.id limit pageSize,pageNum
关于mysql中order by的解释:
如果order by的字段有多个行都有相同的值,mysql是会随机的顺序返回查询结果的,具体依赖对应的执行计划。也就是说如果排序的列是无序的,那么排序的结果行的顺序也是不确定的。
上面场景的排序字段是按照日期字段进行排序的,因此分页出现了部分重复数据。