`
com0606
  • 浏览: 60967 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mysql order by和limit共用bug

    博客分类:
  • work
阅读更多
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 的一个坑.docx

    MySQL 是一种广泛使用的关系型数据库管理系统,它提供了强大的查询功能,其中 ORDER BY 和 LIMIT 两个关键字是最常用的查询语句。然而,在某些情况下,使用 ORDER BY 和 LIMIT 两个关键字可能会出现一些坑,今天...

    activiti5.9修复mysql order by 排序bug

    activiti5.9修复mysql order by 排序bug 详情见博客地址:http://blog.csdn.net/qq413041153/article/details/7740773#comments

    Mysql排序和分页(order by&limit)及存在的坑

    总之,`ORDER BY`和`LIMIT`是MySQL中用于数据排序和分页的关键工具,理解它们的用法并注意性能优化,能有效提升数据库查询的效率和用户体验。在实际应用中,应结合具体场景选择合适的排序和分页策略,以达到最佳效果...

    MySQL查询优化:连接查询排序limit(join、order by、limit语句)介绍

    在MySQL查询优化中,连接查询(join)与排序(order by)和限制返回结果的数量(limit)是常见的操作,但当它们结合在一起时,可能会导致性能下降。这个问题在标题和描述中已经阐述得很清楚,主要涉及到如何高效地...

    MySQL中union和order by同时使用的实现方法

    MySQL中union和order by是可以一起使用的,但是在使用中需要注意一些小问题,下面通过例子来说明。首先看下面的t1表。 1、如果直接用如下sql语句是会报错:Incorrect usage of UNION and ORDER BY。 SELECT * FROM ...

    关于Mysql分页的两种方法,假分页和limit分页

    例如,`SELECT * FROM table ORDER BY column LIMIT offset, limit` 这个SQL语句会返回从`offset`位置开始的`limit`条记录。这种方式在数据量较小的情况下效率较高,因为它避免了传输大量不必要的数据。然而,随着...

    深入解析mysql中order by与group by的顺序问题

    mysql 中order by 与group by的顺序是:selectfromwheregroup byorder by注意:group by 比order by先执行,order by不会对group by 内部进行排序,如果group by后只有一条记录,那么order by 将无效。要查出group ...

    MySQL Order By索引优化方法

    MySQL的`ORDER BY`和`GROUP BY`子句在执行查询时,对于性能的影响是显著的,尤其是在大数据量的表中。为了提高查询效率,索引优化显得至关重要。本文将详细介绍如何利用索引来优化`ORDER BY`操作。 首先,MySQL在...

    MYSQL随机抽取查询 MySQL Order By Rand()效率问题

    在MySQL中,直接使用`ORDER BY RAND()`对整个表进行排序,然后通过`LIMIT`获取指定数量的随机行,这种方法在大数据量时极其低效,因为它会进行全表扫描,对于每一行数据都要计算一次随机值,导致性能急剧下降。...

    深度分析mysql GROUP BY 与 ORDER BY

    本文就和大家一起深入研究下mysql中group by与order by.下面是我模拟我的内容表   我现在需要取出每个分类中最新的内容 select * from test group by category_id order by `date` 结果如下   明显。这不是我想...

    Mysql联合查询UNION和Order by同时使用报错问题的解决办法

    因此,常常出现这样的错误 代码如下:select * from [IND] where INDID>10unionselect * from [IND] where INDID<9>10 order by INDID descunionselect * from [IND] where ...难道UNION和ORDER BY 不能同时存在? union

    MySQL 通过索引优化含ORDER BY的语句

    6. **WHERE + ORDER BY + LIMIT组合优化**:为`WHERE`和`ORDER BY`的列创建联合索引可以进一步提升效率。例如: ```sql SELECT [column1],[column2],…. FROM [TABLE] WHERE [columnX] = [value] ORDER BY [sort] ...

    MYSQL order by排序与索引关系总结1

    反之,如果查询涉及的行数过多、使用了不同索引、索引列既有升序又有降序排列,或者WHERE和ORDER BY使用了不同索引,或者使用了列的表达式或函数,MySQL则可能使用FileSort。 例如,`SELECT * FROM friends WHERE ...

    MySQL group by和order by如何一起使用

    假设有一个表:reward(奖励表),表结构如下: CREATE TABLE test.reward ( id int(11) NOT NULL AUTO_INCREMENT, uid int(11) NOT NULL COMMENT '用户uid', money decimal(10, 2) NOT NULL COMMENT '奖励金额'...

    mysql分组取每组前几条记录(排名) 附group by与order by的研究

    –按某一字段分组取最大(小)值所在行的数据 代码如下: /* 数据如下: nameval memo a 2 a2(a的第二个值) a 1 a1–a的第一个值 a 3 a3:a的第三个值 b 1 b1–b的第一个值 b 3 b3:b的第三个值 b 2 b2b2b2b2 b 4 b4b4 b ...

    Mysql_limit.zip_limit

    通过以上讲解,我们了解了`LIMIT`在MySQL中的作用、使用方法以及与`ORDER BY`的配合,以及如何通过优化来提高查询效率。在实际开发中,熟练掌握`LIMIT`的运用能帮助我们更好地处理大数据查询,提升数据库的性能。

    MySQL知识点 Select的子句Order By 与 limit.pdf

    本PDF文档是作为萌狼蓝天CSDN萌狼蓝天-MySQL专栏-的补充 因为文档的图片上传失败了没有图片,所以需要看图的可以下载本附件

    Mysql中order by、group by、having的区别深入分析

    在MySQL数据库中,ORDER BY、GROUP BY 和 HAVING 子句是SQL查询中用于数据处理的关键组成部分,它们各自承担不同的任务,以帮助我们从数据库中提取有用的信息。 ORDER BY 子句主要用于对查询结果集进行排序。当你...

    【mysql知识点整理】— order by 、group by 出现Using filesort原因详解

    MySQL中的`ORDER BY`和`GROUP BY`是SQL查询中两个关键的子句,它们用于对查询结果进行排序和分组。然而,在某些情况下,MySQL可能会使用`Using filesort`来完成这些操作,这通常会导致性能下降。本文将深入探讨`...

Global site tag (gtag.js) - Google Analytics