当前位置:首页 > 开发 > 数据库 > 正文

mysql order by和limit共用bug

发表于: 2015-06-11   作者:com0606   来源:转载   浏览次数:
摘要: select app_id from t_instal where user_id = ? and app_id is not null order by id desc limit 1;  在mysql下执行没有问题,可以得到预期结果。但是用jdbc执行的时候就得不到预期结果了。不知道是不是sql解析的问题。网上找到同样的问题,记录如下   写道 官网地址:http
select app_id from t_instal where user_id = ? and app_id is not null order by id desc limit 1;

 在mysql下执行没有问题,可以得到预期结果。但是用jdbc执行的时候就得不到预期结果了。不知道是不是sql解析的问题。网上找到同样的问题,记录如下

 

写道
官网地址:http://bugs.mysql.com/bug.php?id=32933

以下转载:http://bbs.chinaunix.net/thread-1276235-1-1.html

我的SQL很简单
我想从一个表中检索所有标题含有“中国”的数据,将它们按id排序,取前5条,所以我写了以下语句
SQL语句1:

select fi_id, fi_url, fi_title
from InfoTable
where fi_title like '%中国%'
order by fi_id desc
limit 5

当我只使用order by时,能够返回13条结果
只使用limit时,能够返回其中的5条结果
但是当我同时使用order by和limit时,却返回0条结果

同时我们还发现,这种情况并不是在所有检索词上都会出现,如把检索词由“中国”换为“足球”等就不会出现这种现象。

在和同事的讨论中,有人提出了以下方法
SQL语句2:

select * from
(select fi_id, fi_url, fi_title
from InfoTable
where fi_title like '%中国%'
order by fi_id desc ) a
limit 5

语句2能够正确的得到5条结果

这给了我们一些启发:语句1和语句2的执行并不相同,所以语句1很可能与我们最初设想不符,所以,我们对语句1进行了以下修改
limit 5 ---> limit 50000

得到SQL语句3:

select fi_id, fi_url, fi_title
from InfoTable
where fi_title like '%中国%'
order by fi_id desc
limit 50000

此SQL语句能够正确得到13条结果

由此我们推测:在同时使用order by和limit时,MySQL进行了某些优化,将语句执行逻辑从"where——order by——limit"变成了"order by——limit——where",导致在某些情况下,同时使用order by和limit会导致查无结果(或结果数量不足)。具体出现问题与否是与表中数据有关的。

 看来order by和limit共用会有问题的,但是这只会在某些特殊情况下,使用的时候还是要考虑到这个会导致的bug的。

mysql order by和limit共用bug

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
sql注入在组合拼接方面一直都很灵活,因为语法本身就很灵活,不过Mysql的Limit下一直没办法注入,国外
写在前面 上篇文章介绍mysql的增删改查操作,这篇将介绍group和order by操作。 系列文章 mysql之创
这两天让一个数据查询难了。主要是对group by 理解的不够深入。才出现这样的情况 这种需求,我想很
mysql order by 索引: 知道的大神求解啊。另外order by 效率问题有没有解决方案啊,求分享 直接 上
ORDER BY 可以匹配索引是限制的 具体可以参考下http://dev.mysql.com/doc/refman/5.6/en/order-by-o
ORDER BY 可以匹配索引是限制的 具体可以参考下http://dev.mysql.com/doc/refman/5.6/en/order-by-o
ORDER BY 可以匹配索引是限制的 具体可以参考下http://dev.mysql.com/doc/refman/5.6/en/order-by-o
假设mongoDB有如下数据, 1, 2,3,4,5,6,7,8,9,10 想变成 A1,A2 ,A3 ,B4 , B5 , B6 ,
假设mongoDB有如下数据, 1, 2,3,4,5,6,7,8,9,10 想变成 A1,A2 ,A3 ,B4 , B5 , B6 ,
1、MYSQL中LIMIT用法_百度知道 limit是mysql的语法select * from table limit m,n 其中m是指记录开
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号