1

我有这个查询:

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

我没有看到问题。你可以帮帮我吗?

4

2 回答 2

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 参数。

于 2013-10-06T16:48:45.043 回答
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;
于 2013-10-06T16:51:20.060 回答