MySQL用户变量和SUM函数

Ale*_*lec 5 mysql

我正在尝试在SELECT查询中进行一些计算,使用用户变量来执行此操作.这很好用,直到我开始使用类似于SUM从连接表中收集数据的函数.

简化示例:

SET @a = 1;

SELECT @a := SUM(1 + 1) AS sum, @a
Run Code Online (Sandbox Code Playgroud)

结果:

+------+------+
| sum  | @a   |
+------+------+
|    2 |    1 |
+------+------+

我希望@a在这里是2.

其他例子:

SELECT @b := SUM(1 + 1) AS sum, @b;
Run Code Online (Sandbox Code Playgroud)
+------+------+
| sum  | @b   |
+------+------+
|    2 | NULL |
+------+------+

现在它是NULL,因为@b在查询之前没有设置.

看来该变量不会被SUM函数的结果覆盖.有没有什么办法解决这一问题?

Pav*_*ler 5

文档中所述:

作为一般规则,您不应该为用户变量赋值并在同一语句中读取值.您可能会得到您期望的结果,但这不能保证.涉及用户变量的表达式的评估顺序是未定义的,可能会根据给定语句中包含的元素进行更改; 此外,MySQL服务器版本之间的订单不保证相同.在SELECT @a, @a:=@a+1, ...,您可能认为MySQL将@a首先进行评估,然后再进行一次分配.然而,改变的声明(例如,通过添加GROUP BY,HAVINGORDER BY子句)可能引起的MySQL顺序不同的评价,选择的执行计划.

到你问题的第二部分.您可以@variable在这样的查询中初始化您的信息(首先评估子查询):

SELECT @b := SUM(1 + 1) AS sum, @b FROM (SELECT @b:=0) b
Run Code Online (Sandbox Code Playgroud)