MySQL - 在select中定义一个变量并在同一个select中使用它

时间:2013-05-23 13:41:11

标签: mysql variables select procedure mysql-variables

是否有可能做这样的事情?

SELECT 
    @z:=SUM(item),
    2*@z
FROM
    TableA;

我总是为第二列获取NULL。奇怪的是,在做像

这样的事情时
SELECT 
    @z:=someProcedure(item),
    2*@z
FROM
    TableA;

一切都按预期工作。为什么呢?

3 个答案:

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