建表语句如下: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这一步

解决方案 »

  1.   

      问题是为什么一定要给初值, 想知道第一种情况下出错的原因这个初始化给的null 也有意义?
      

  2.   


    你直接运行
    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
    会提示出错,变量必须赋初值,语法要求
      

  3.   

    如果变量不赋初值,默认为NULL值
      

  4.   

    对呀   那下面的语句复制为null 就没有什么用 但是下面的查询语句就是结果正确的我想是不是select里面会有什么逻辑我就想知道这个原理, 为什么第一个在第一次没有初始化执行的时候会出现不正确的结果不知道这个原因,感觉很困惑
      

  5.   

    你仔细看看对@rank的赋值 @rank:=0
    @A无论是否赋初值,第1次值都为NULL
      

  6.   

    改造一下第一种查询语句,加上@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如何解释这个现象?
      

  7.   

    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 
      

  8.   

    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 
      

  9.   

    我刚才执行了一下 你这个在第一次执行也不行,返回的@a都是null这个问题我认为是不是如果没有初始化, IF(@a=X.a, @rank:=@rank+1, @rank:=1) 执行的时候就报错但是整个sql执行是可以成功的,所以这个假设也不一定成立
      

  10.   

    根据要看看MYSQL的源代码,看看是如何处理变量的,没有必要在这个问题上纠结