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

Posted 沛沛老爹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 排序Order by与分页limit结合的数据异常问题的主要内容,如果未能解决你的问题,请参考以下文章

Mysql order by与limit混用陷阱

mysql order by 与 limit 混用陷阱

Mysql查询使用limit分页,同时使用order by可能产生的问题

坑,MySQL中 order by 与 limit 混用,分页有BUG!

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

postgresql----排序ORDER BY,分组GROUP BY,分页OFFSET&&LIMIT