mysql order by跟limit,mysql中order by和limit同时使用时存在的问题及解决方法

今天突然遇到一个问题,同时使用order by 和 limit 时存在问题(order by 列存在重复值);

就是当使用 limit 140,10  和 limit 130,10的数据是一样;

按正常理解,两者之间数据应该是不一样

执行sql如下:[同时,我给了测试sql,测试数据以及测试表结构]

SELECT

p.id,

p.org_name AS orgName,

p.city_id AS cityId,

p.is_cooperation AS isCooperation,

p.create_time AS createTime,

p.maintenancer AS creater,

p.audit_status AS auditStatus

FROMpartner_organization p

WHEREp.partner_type = 1

AND p.city_id IN (1, 2)

ORDER BYp.create_time DESC

LIMIT 140,10

执行后结果集如下:

QQ%E6%88%AA%E5%9B%BE20150228184142.png

执行如下sql:

SELECT

p.id,

p.org_name AS orgName,

p.city_id AS cityId,

p.is_cooperation AS isCooperation,

p.create_time AS createTime,

p.maintenancer AS creater,

p.audit_status AS auditStatus

FROMpartner_organization p

WHEREp.partner_type = 1

AND p.city_id IN (1, 2)

ORDER BYp.create_time DESC

LIMIT 130,10

则结果集如下:

QQ%E6%88%AA%E5%9B%BE20150228184142.png

两者的结果集明显一样;

因此,我们推测:

在同时使用order by和limit时,MySQL进行了某些优化,

将语句执行逻辑从”where——order by——limit”变成了”order by——limit——where”

那么针对这条语句,我们如何进行优化呢,我们采取两种方式:

方式一:我们将排序列,新增一列,确保唯一性来实现limit

SELECT

p.id,

p.org_name AS orgName,

p.city_id AS cityId,

p.is_cooperation AS isCooperation,

p.create_time AS createTime,

p.maintenancer AS creater,

p.audit_status AS auditStatus

FROM partner_organization p

WHERE p.partner_type = 1

AND p.city_id IN (1, 2)

ORDER BY

p.create_time,id DESC

LIMIT 140,10

方式二:我们用where过滤后形成结果集,作为子查询来处理

SELECT

p.id,

p.org_name AS orgName,

p.city_id AS cityId,

p.is_cooperation AS isCooperation,

p.create_time AS createTime,

p.maintenancer AS creater,

p.audit_status AS auditStatus

FROM(

SELECT     *

FROM partner_organization p

WHERE p.partner_type = 1 AND p.city_id IN (1, 2)

) p

ORDER BY p.create_time DESC

LIMIT 130,10

测试数据下载地址如下:

链接: http://pan.baidu.com/s/1gdy7hQj

密码: icx8

4dc732db7228af439168babd89ef01dc?s=42&r=g

Author: Michael

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值