1. 现象与问题 ORDER BY排序后,用LIMIT取前几条,发现返回的结果集的顺序与预期的不一样 下面是我遇到的问题: 可以看到,带LIMIT与不带LIMIT的结果与我预期的不一样,而且“很不可思议”,真是百思不得其解 后来百度了一下,如果order by的列有相同的值时,mysql会随机选取这些行,为了保证每次都返回的顺序一致可以额外增加一个排序字段(比如:id),用两个字段来尽可能减少重复的概率 于是,改成 order by status, id; 问题虽然是解决了,但还是看看官方文档
转自: https://blog.csdn.net/tsxw24/article/details/44994835 我经常使用order by和limit来做数据分页显示并排序,一直也没发现过什么问题.但这两天缺遇到一个严重的问题,在按时间戳升序排列并用limit分批读取数据时,却发现在某些记录丢失了,表中明明有的记录确死活读取不到.研究了大半天终于发现了问题所在,记录一下以防忘记,也是给大家提个醒. 问题重现 工具和原料 数据库: Ver 14.14 Distrib 5.6.11, for L
在 MySQL 执行查询的时候,我们可能既要对结果集进行排序又要限制行数,那么此时 order by 与 limit 的执行顺序是怎么样的呢? order by与limit的执行顺序是:先执行order by,然后执行limit. order by与limit的写顺序是:先写order by,再写limit. 正确写法如下: ; 错误写法如下(写错了 order by 与 limit 的顺序): order by id desc; 执行这个SQL语句的时候会报错.
背景说明 今天写出一个十分弱智的bug,记录一下,提醒自己以后别这种犯错,不怕丢人哈~ 在写一个分页查询记录的sql时,要根据添加的时间逆序分页输出,之前的写法是酱紫 select record.a, y.c from ( select a,b from x order by timestamp desc limit 0,10 ) record left join y on record.b = y.d; 因为一些新的需求,要在后面加一些where条件,limit操作不能在嵌套查询里面加了,于是
如下: ORDER BY 与 LIMIT 的执行顺序:ORDER BY > LIMIT ORDER BY 与 LIMIT 的编写顺序:ORDER BY > LIMIT 正确写法: select * from myTest ORDER BY id DESC LIMIT 6; 附上MySql的sql语句执行顺序 FROM table1 left join table2 on 将table1和table2中的数据产生笛卡尔积,生成Temp1 JOIN table2 所以先是确定表,再确定关联条件 O
最近由于需要大概研究了一下MYSQL的随机抽取实现方法.举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1. 但是,后来我查了一下MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次扫描.但是在MYSQL 3.23版本中,仍然可以通过ORDER BY RAND()来实现随机. 但是真正测试一下
在Mysql中我们常常用order by来进行排序,使用limit来进行分页,当需要先排序后分页时我们往往使用类似的写法select * from 表名 order by 排序字段 limt M,N.但是这种写法却隐藏着较深的使用陷阱.在排序字段有数据重复的情况下,会很容易出现排序结果与预期不一致的问题. 比如现在有一张user表,表结构及数据如下: 现在想根据创建时间升序查询user表,并且分页查询,每页2条,那很容易写出sql为:select * from user order by cre
MySQL很多时候需要获取随机数据,举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是: 但是,后来我查了一下MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次扫描.但是在MYSQL 3.23版本中,仍然可以通过ORDER BY RAND()来实现随机. 测试一下才发现这样效率非常低.一个15万余条的库,查询5条数据,居然要8秒以上.查看官方手册,也说rand()放在ORDER BY
mysql查询语句,通过limit来限制查询的行数. 例如: select name from usertb where age > 20 limit 0, 1; //限制从第一条开始,显示1条 select name from usertb where age > 20 limit 1; //同上面的一个效果 select name from usertb where age > 20 limit 4, 1; //显示从第五条开始,显示1条 select name from user
解释:mycat在执行分页排序的时候,分成2步走.如果M很大,会改写成 limit 0,m+n, 然后在每个MYSQL分片上排序后还需要在mycat汇总输出,所以会很慢.下面是详细执行计划以及日志输出(目前针对这种大分页数据,性能很差,尽量避免,再没有好的优化方案出来之前) 1 先将分页SQL改写分发各个datanode上,变成 SELECT * FROM travelrecord ORDER BY id LIMIT 0, 100100去, 2 然后在mycat端进行汇总 执行elect * f
mysql执行如下语句 : SELECT * FROM `xxx_base_info` where yn =1 and xxx_keeper_id in (SELECT id FROM `user`where level>1 and yn =1 order by level desc limit 50) MySQL 返回: #1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
在supesite里面执行一个SQL语句: select * from supe_spaceitems where catid=98 and itemid not in(select itemid from supe_spaceitems where catid=98 and haveattach=1 order by itemid desc limit 1) order by itemid desc limit 3; 发现如下提示: #1235 - This version of MySQL
This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'的意思是,这版本的 MySQL 不支持使用 LIMIT 子句的 IN/ALL/ANY/SOME 子查询,即是支持非 IN/ALL/ANY/SOME 子查询的 LIMIT 子查询. 也就是说,这样的语句是不能正确执行的. select * from table where id in (select id from table limit 10)
This version of MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/SOME 错误解决 这次国庆节回来后的测试中,在一个Mysql表达式中使用嵌套查询,出现了这个错误.原因是内层select语句带有limit子句. 在网上查了下,有文章指出: 比如这样的语句是不能正确执行的. ); 但是,只要你再加一层就行.如: )as t) 这样就可以绕开limit子查询的问题. 问题解决. 后来我发现,上述是解决问题的一个方法,其实还有一个更好的做法,
ERROR: NotImplementedException: ORDER BY without LIMIT currently not supported impala中order by 需要limit的限制才可以运行,否则报错,可以通过limit一个很大的值来查看所有的数据,另外limit不支持 limit a,b这种格式. select ip,count(1) as cnt from cdnlog.dd_log group by ip order by cnt desc limit