mysql group by导致分页重复数据问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql group by导致分页重复数据问题相关的知识,希望对你有一定的参考价值。

参考技术A 由于group 不用会导致分页有重复数据,需要外面再加一层查询,正确示例:
SELECT a.* FROM (select company_id
,COALESCE(sum(total_amount),0) total_amount
from t_statistics
group by company_id
order by batch_date desc) a
LIMIT 0,20

Mysql 排序Order by与分页limit结合的数据异常问题

前言

在使用order by 进行排序的时候,使用LambdaQueryWrapper也是杠杠的。使用orderByDesc方法可以很方便的进行多字段排序。

问题

但是使用分页排序的时候,Limit出来的数据,居然会重复。

刚开始以为使用了多个字段进行order by ,导致查询结果不正常。

出于对自己技术的不信任,特意跑到mybati-plus官网查了文档,发现一切都是正常的。

那么就是mysql的问题了。

开启sql日志输出,发现sql正常,使用查询的时候,发现数据重叠了。

第一页数据

SELECT uid,like,endorse,fans,dynamic_num,question_num,answer_num,topic_num,article_num,collect,yesterday_earnings,focus,browse,is_del FROM statistic WHERE is_del=0 AND (uid <> 0) ORDER BY yesterday_earnings DESC,fans DESC,article_num DESC LIMIT 0,10;

第三页数据

SELECT uid,like,endorse,fans,dynamic_num,question_num,answer_num,topic_num,article_num,collect,yesterday_earnings,focus,browse,is_del FROM statistic WHERE is_del=0 AND (uid <> 0) ORDER BY yesterday_earnings DESC,fans DESC,article_num DESC  LIMIT 30,10;

不分页

如果不分页的话,数据是正常的。

可以看到,带LIMIT与不带LIMIT的结果与预期的不一样。

 好了,芭比Q了。

看来问题是出现在order by 和limit的组合上了

LIMIT

官方解释:

 

If multiple rows have identical values in the ORDER BY columns, the server is free to return those rows in any order, and may do so differently depending on the overall execution plan. In other words, the sort order of those rows is nondeterministic with respect to the nonordered columns.

One factor that affects the execution plan is LIMIT, so an ORDER BY query with and without LIMIT may return rows in different orders. 

就是说当前数据存在多个重复值的话,返回的数据是free(自由)的方式返回数据。

官方解释这是一个LIMIT的特性。

问题找到了,那解决就好办了。

增加一个唯一列,来解决排序异常的问题。uid的唯一的,在原来的order by中增加uid字段

增加之后的数据如下所示

第一页

 第二页

问题完美解决

总结

这个问题主要是对LIMIT不是很熟悉,导致的问题。

以上是关于mysql group by导致分页重复数据问题的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver分页去重失效

Mysql 排序Order by与分页limit结合的数据异常问题

Order by排序后分页limit取值出现重复显示问题

MySQL - Group By 有去重功能吗?

如何使用 group by [重复] 使用 mySQL 删除数据库中的记录

MySQL分页时使用 limit+order by 会出现数据重复问题