在sql语句中计数记录失败

时间:2013-10-06 16:42:06

标签: mysql sql

我有这个问题:

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

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

2 个答案:

答案 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;