我有这个问题:
SELECT @i:=@i+1, s.*
FROM quiz.score s
WHERE id BETWEEN @a - @l1 AND @a + @l2 order by points desc;
@i:=@i+1
每行增加但我得到每条记录NULL
。
我没有看到问题。 你能帮帮我吗?
答案 0 :(得分:3)
与任何用户定义的变量一样,@ i在会话开始时的初始值为NULL,然后NULL + 1总是产生NULL。 NULL不为0.
你应该在开始计数之前初始化@i:= 0.
您可以单独声明:
SET @i:=0;
SELECT @i:=@i+1, s.*
FROM quiz.score s
WHERE id BETWEEN @a - @l1 AND @a + @l2 order by points desc;
或者其他一些人做的是写一个子查询来做这件事:
SELECT @i:=@i+1, s.*
FROM (SELECT @i:=0) AS _init
JOIN quiz.score s
WHERE id BETWEEN @a - @l1 AND @a + @l2 order by points desc;
解决初始案例的最后一种方法是使用COALESCE()将@i默认为0:
SELECT @i:=COALESCE(@i,0)+1, s.*
FROM quiz.score s
WHERE id BETWEEN @a - @l1 AND @a + @l2 order by points desc;
COALESCE()函数返回第一个非NULL的参数。
答案 1 :(得分:1)
你没有设置@i, 所以默认情况下@i是NULL 和任何值+ NULL = NULL 尝试
SET @i = 0;
SELECT @i:=@i+1, s.*
FROM quiz.score s
WHERE id BETWEEN @a - @l1 AND @a + @l2 order by points desc;