mysql order by+limit数据重复问题

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

案例

表结构如下:

字段类型注释
idvarchar(20)主键
col1varchar(20)col1
col2varchar(20)col2
col3varchar(20)col3

全表查询:

SELECT * FROM test1 ORDER BY col1 DESC;

数据为:

idcol1col2col3
155910
12256
14278
16245
11123

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

分页查询第一页:

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

查询结果:

idcol1col2col3
155910
16245
12256

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

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

查询结果:

idcol1col2col3
16245
11123

我们就会发现,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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值