Mysql 里面使用row_number() 的用法和注意

来源:互联网 发布:apache weblogic 插件 编辑:程序博客网 时间:2024/06/05 03:34
虽然使用不多,但是也有情况是需要在mysql 里面写语句开发功能的。在sql server 使用惯了,习惯了使用row_number() 函数进行排序,但是mysql 确没有这样一个函数。然后找到了po主写的一篇 文章。通过变量赋值来查询的。(PS 我测试的版本是mysql 5.6)

参考链接:http://www.cnblogs.com/advocate/archive/2012/03/02/2376900.html

先建表

CREATE TABLE `test` (  `ID` int(11) NOT NULL AUTO_INCREMENT,  `Col1` varchar(50) DEFAULT NULL,  `Col2` varchar(50) DEFAULT NULL,  `Col3` int(11) DEFAULT NULL,  `Col4` float DEFAULT NULL,  PRIMARY KEY (`ID`)) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

然后插入测试数据,使用po主介绍的方法来测试

insert into test(Col1,Col2,Col3,Col4) values (1,2,3,4),(1,2,6,5),(1,2,7,8),(1,"激发",5,7);delimiter //select @row:=case when @row is null then 1 else @row+1 end as RNr,                ID,Col1,Col2,Col3,Col4 from test ;//delimiter ;

结果查询出结果是 

 

查询出来的记过,Rnr为什么都是1 呢?因为对于本次查询来说,@row 这个变量的值,一直都是null ,所以根据case 的判别式来看的话,就只能是1 了。引起了这种现象。但是再执行,就正常的了,我们将同样的脚本

再执行一次,查出来应该就是2345了

 

测试验证确实如此,由此可见。变量在本次会话里面是一直存在的,并且每次会沿用,所以就出现前面的那种情况。

其实对应的解决方法也很简单,既然因为每个会话都会用同一个值,那么只需要在开始的时候赋初值就可以解决问题了,比如我们这个例子在开始的时候将 set @row = 0; 加上这句,那么每次执行,都会先赋初值,当然就可以得到一致的执行效果了。

 

这个测试告诉了我,在这个数据库里面,控制变量初始值hin重要。

 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微博授权失败怎么办 新浪微博被官方封号怎么办 电磁波辐射重度异常怎么办 卖鞋没有生意怎么办 华为手机越来越卡怎么办 华为手机电越充越少怎么办 土炕有裂缝冒烟怎么办 农村土炕不好烧怎么办 夏天土炕不好烧怎么办 怎么办我是个肚脐控 联想笔记本电池显示损坏怎么办 电脑关机没反应怎么办 变色灯坏了怎么办 衣服颜色太艳怎么办 自行车掉链子怎么办图解 南联邦大学怎么办入学 群租公寓业主怎么办 孩子上课不举手怎么办 门颜色太难看怎么办 玛雅水公园下雨怎么办 鱼竿手把节断怎么办 印度出兵马尔代夫中国怎么办 看见死的黄鼠狼怎么办 养的小猫死了怎么办 黄鼠狼遇到危险该怎么办 黄鼠狼打跑了怎么办 出口退税过期了怎么办? 接收不到验证码怎么办 退税单掉了怎么办 新风机噪音大怎么办 新风系统噪音大怎么办 点球大战平了怎么办 意大利护照被抢怎么办 剑三跑商货物丢了怎么办 eve物品仓库不够怎么办 穿越到二战德国怎么办? 胸罩被染红色怎么办 刘海总是往下掉怎么办 马桶盖老往下掉怎么办 护膝老是往下掉怎么办 避光垫往下掉怎么办