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导致分页重复数据问题的主要内容,如果未能解决你的问题,请参考以下文章
Mysql 排序Order by与分页limit结合的数据异常问题