关于MYSQL查询语句中临时变量的问题

benluobo 2013-09-25 07:03:25
建表语句如下:

create table test(a int , b int, c int);

insert into test select 1, 2, 20;
insert into test select 1, 3, 21;
insert into test select 1, 4, 22;
insert into test select 1, 5, 23;
insert into test select 1, 6, 24;
insert into test select 2, 7, 25;
insert into test select 2, 8, 26;
insert into test select 2, 9, 27;
insert into test select 2, 10,28;
insert into test select 2, 11,29;


查询语句如下:


select a, b, c, if(@a=X.a, @rank:=@rank+1, @rank:=1) as rank, @a:=X.a
from
(select a,b,c from test order by a, b, c) X



问题是在这个查询在某个connection中第一次查看所有的rank都是1

如果多查询几次,rank就正常了


但是如果语句改为:

select a, b, c, if(@a=X.a, @rank:=@rank+1, @rank:=1) as rank, @a:=X.a
from
(select @a:=null, @rank:=0, a,b,c from test order by a, b, c) X


那这样即使第一次查询也是对的

问题是为什么需要@a:=null, @rank:=0这一步
...全文
1130 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
WWWWA 2013-09-26
  • 打赏
  • 举报
回复
根据要看看MYSQL的源代码,看看是如何处理变量的,没有必要在这个问题上纠结
benluobo 2013-09-26
  • 打赏
  • 举报
回复
我刚才执行了一下 你这个在第一次执行也不行,返回的@a都是null 这个问题我认为是不是如果没有初始化, IF(@a=X.a, @rank:=@rank+1, @rank:=1) 执行的时候就报错 但是整个sql执行是可以成功的,所以这个假设也不一定成立
WWWWA 2013-09-26
  • 打赏
  • 举报
回复
or SELECT a, b, c, @a, IF(@a=X.a, @rank:=@rank+1, @rank:=1) AS rank, @a:=GREATEST(0,X.a ) FROM (SELECT a,b,c FROM test ORDER BY a, b, c) X
WWWWA 2013-09-26
  • 打赏
  • 举报
回复
select a, b, c, @a, if(@a=X.a, @rank:=@rank+1, @rank:=1) as rank, @a:=0+X.a from (select a,b,c from test order by a, b, c) X
benluobo 2013-09-26
  • 打赏
  • 举报
回复
改造一下第一种查询语句,加上@a, 看看每条记录这个值的变化 select a, b, c, @a, if(@a=X.a, @rank:=@rank+1, @rank:=1) as rank, @a:=X.a from (select a,b,c from test order by a, b, c) X 在connection中第一次查询的时候 这个语句在查询到X表的第二条记录的时候就应该@a有值了,应该为X表的第一条数据 但是可以看到实际结果@a在所有记录中都是null 如何解释这个现象?
WWWWA 2013-09-26
  • 打赏
  • 举报
回复
你仔细看看对@rank的赋值 @rank:=0 @A无论是否赋初值,第1次值都为NULL
benluobo 2013-09-26
  • 打赏
  • 举报
回复
对呀 那下面的语句复制为null 就没有什么用 但是下面的查询语句就是结果正确的 我想是不是select里面会有什么逻辑 我就想知道这个原理, 为什么第一个在第一次没有初始化执行的时候会出现不正确的结果 不知道这个原因,感觉很困惑
WWWWA 2013-09-26
  • 打赏
  • 举报
回复
如果变量不赋初值,默认为NULL值
benluobo 2013-09-26
  • 打赏
  • 举报
回复
不会出错 这就是我为什么提问的原因 这样我在客户端执行的时候是不会出错的 麻烦你可以试一下
WWWWA 2013-09-26
  • 打赏
  • 举报
回复
引用 3 楼 benluobobo 的回复:
问题是为什么一定要给初值, 想知道第一种情况下出错的原因 这个初始化给的null 也有意义?
你直接运行 select a, b, c, if(@a=X.a, @rank:=@rank+1, @rank:=1) as rank, @a:=X.a from test X order by a, b, c 会提示出错,变量必须赋初值,语法要求
benluobo 2013-09-26
  • 打赏
  • 举报
回复
问题是为什么一定要给初值, 想知道第一种情况下出错的原因 这个初始化给的null 也有意义?
WWWWA 2013-09-26
  • 打赏
  • 举报
回复
给变量赋初值,其它值也可以
ACMAIN_CHM 2013-09-25
  • 打赏
  • 举报
回复
变量使用前最好显式的初始化。

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧