mysql order by+limit数据重复问题

    前段时间遇到一个问题mysql查询问题,当我们使用select * from xxxx_tbl order by col1 limit 0,5 时,如果col1在表中存在重复,那么我们通过limit分页查出来的数据就可能存在不全,或者重复。

案例

表结构如下:

字段 类型 注释
id varchar(20) 主键
col1 varchar(20) col1
col2 varchar(20) col2
col3 varchar(20) col3

全表查询:

SELECT * FROM test1 ORDER BY col1 DESC;

数据为:

id col1 col2 col3
15 5 9 10
12 2 5 6
14 2 7 8
16 2 4 5
11 1 2 3

其中col1字段不是唯一的,第二第三第四行的col1都是2。

分页查询第一页:

SELECT * FROM test1 ORDER BY col1 DESC LIMIT 0,3;

查询结果:

id col1 col2 col3
15 5 9 10
16 2 4 5
12 2 5 6

这里就会发现,有limit和没有limit查出来的顺序就不一样了。我们再来查第二页:

SELECT * FROM test1 ORDER BY col1 DESC LIMIT 3,6;

查询结果:

id col1 col2 col3
16 2 4 5
11 1 2 3

我们就会发现,16-2-4-5这条记录在两页里都出现了。而14-2-7-8,这条数据两页中都不存在。

原因

摘自mysql官方文档有这么一段话:
在这里插入图片描述
    意思是如果order by的字段有多个行都有相同的值,mysql是会随机的顺序返回查询结果的,具体依赖对应的执行计划(实际的sql是什么)。也就是说如果排序的列是无序的,那么排序的结果行的顺序也是不确定的。

解决方案

    既然官方文档里给出解释了,那也就不必深究了,那解决方案有两种:

  1. 使用唯一键作为排序字段
  2. 如果你一定要使用类似col1这样的字段,那你可以在后面加一个辅助排序字段,形成排序组合:
SELECT * FROM test1 ORDER BY col1,col2 DESC LIMIT 0,3;
发布了39 篇原创文章 · 获赞 9 · 访问量 1019

猜你喜欢

转载自blog.csdn.net/qq_30095631/article/details/103514948