赞
踩
前段时间遇到一个问题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是什么)。也就是说如果排序的列是无序的,那么排序的结果行的顺序也是不确定的。
既然官方文档里给出解释了,那也就不必深究了,那解决方案有两种:
SELECT * FROM test1 ORDER BY col1,col2 DESC LIMIT 0,3;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。