更改HAVING会更改列值

时间:2013-12-23 16:42:22

标签: mysql sql

所以我有一个查询,当运行时,作为最后一列中的值,有1,4和8.但是当我改变HAVING条件时,这些值变为1,3和5.这不会使对我有任何意义。

这是我的SQL:

SELECT memberId, @temp:=total AS total, @runningTotal as runningTotal, @runningTotal:=@temp+@runningTotal AS newRunningTotal
FROM (
    SELECT 1 AS memberId, 1 AS total UNION
    SELECT 2, 2 UNION
    SELECT 3, 2
) AS temp
JOIN (SELECT @temp:=0) AS temp2
JOIN (SELECT @runningTotal:=0) AS temp3
HAVING newRunningTotal <= 40;

这是SQL小提琴:

http://sqlfiddle.com/#!2/d41d8/27761/0

如果我将newRunningTotal更改为runningTotal,我会在runningTotal和newRunningTotal中获得不同的数字。这对我没有任何意义。

以下是更改后的查询的SQL小提琴:

http://sqlfiddle.com/#!2/d41d8/27762/0

有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

MySQL documentation非常明确反对您在select中执行的操作:

  

作为一般规则,除了在SET语句中,你永远不应该   为用户变量赋值并读取其中的值   声明。例如,要增加变量,这没关系:

SET @a = @a + 1;
  

对于其他语句,例如SELECT,您可能会得到结果   期待,但这不能保证。在以下声明中,您   可能会认为MySQL会首先评估@a然后做一个   第二个任务:

SELECT @a, @a:=@a+1, ...;
  

但是,评估顺序为   涉及用户变量的表达式是未定义的。

我认为你发现了一个有所作为的情况。

答案 1 :(得分:1)

使用此sqlFiddle指定小于40, 或者此sqlFiddle也指定少于40。

我认为正在发生的事情是HAVING在一切完成后应用,但由于你的选择中有变量,它们会再次计算,让你无法控制。