现在的位置: 首页 > 关系型数据库 > SQL基本用法 > 正文

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

时间:2015年03月02日 | 分类:SQL基本用法 | 评论:0 条 | 浏览:3,032 次
今天突然遇到一个问题,同时使用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
FROM partner_organization p
WHERE  p.partner_type = 1
AND p.city_id IN (1, 2)
ORDER BY p.create_time DESC
LIMIT 140,10
 
执行后结果集如下:
QQ截图20150228184142
执行如下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
FROM partner_organization p
WHERE p.partner_type = 1
AND p.city_id IN (1, 2)
ORDER BY p.create_time DESC
LIMIT 130,10
 
则结果集如下:
QQ截图20150228184142
两者的结果集明显一样;
因此,我们推测:
     在同时使用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

×