我有这个查询:
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
。
我没有看到问题。你可以帮帮我吗?
与任何用户定义的变量一样,@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 参数。
您没有设置@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;