SQL中排序值不唯一导致分页取值重复的问题

断鸿 2019年07月15日 82次浏览

[toc]

问题描述:order by排序排序字段不唯一,排序后在通过limit分页取值,不同页上的数据可能会存在重复,部分数据可能在所有页都不会出现。sql类似于:select * from table order by time limit 0, 10;


原因分析:对于limit来说它是MySQL数据库顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数。其实简单的说就是,你去查数据库,limit就是MySQL根据返回数据的顺序给他的一个编号,谁先返回谁就是1,如果不存在order by排序条件那么它就是MySQL的存储顺序。

错误导致原因分析:查询的数据的time这个字段的值是一样的时候,MySQL在返回数据时,返回数据顺序不是固定的,我们取前8个数据的时候,数据库返回数据的顺序,与我们取前15个数据时,数据库返回数据的顺序是完全不同的,于是他生成的limit伪列编号就完全不一样,就导致了这样的错误。


解决方法:添加第二重唯一字段排序(如主键字段),select * from table order by time, id limit 0, 10;

time字段相同的记录会按照id再进行排序。