是否有可能做这样的事情?
SELECT
@z:=SUM(item),
2*@z
FROM
TableA;
我总是为第二列获取NULL。奇怪的是,在做像
这样的事情时SELECT
@z:=someProcedure(item),
2*@z
FROM
TableA;
一切都按预期工作。为什么呢?
答案 0 :(得分:27)
MySQL documentation对此很清楚:
作为一般规则,您不应该为用户变量赋值 并在同一语句中读取值。你可能会得到 你期望的结果,但这不能保证。的顺序 涉及用户变量的表达式的评估是未定义的 可能会根据给定声明中包含的元素进行更改; 另外,这个顺序不保证是相同的 MySQL服务器的版本。在SELECT @ a,@ a:= @ a + 1,...,你可以 认为MySQL会首先评估@a然后做一个任务 第二。但是,更改语句(例如,通过添加 GROUP BY,HAVING或ORDER BY子句可能导致MySQL选择一个 执行计划具有不同的评估顺序。
您可以使用子查询执行所需操作:
select @z, @z*2
from (SELECT @z:=sum(item)
FROM TableA
) t;
答案 1 :(得分:3)
适用于mysql 5.5
select @code:=sum(2), 2*@code
+---------------+---------+
| @code:=sum(2) | 2*@code |
+---------------+---------+
| 2 | 4 |
+---------------+---------+
答案 2 :(得分:0)
mysql> select @z := sum(5), if(@z := sum(5), 2*@z, 0) ;
+--------------+------------------------------+
| @z := sum(5) | if(@z := sum(5), 2*@z, null) |
+--------------+------------------------------+
| 5 | 10 |
+--------------+------------------------------+
我认为在2*@z
语句中包装if
将确保在额外计算之前执行sum
。