2013-03-27 65 views
1

我可以使用在select语句中设置的变量吗?使用select语句中设置的变量

我想要做这样的事情(这显然是不工作):

SELECT 
    YEAR(date_of_spend), 
    @current := SUM(spend_amount), 
    @half := (SUM(spend_amount)/2), 
    (@current - @half) 
FROM `sales_data` 
GROUP BY YEAR(date_of_spend) 

回答

1

号根据MySQL手册:

作为一般规则,你不应该赋值给一个用户变量 和读取相同的语句中的值。您可能会得到您期望的 结果,但这不能保证。对涉及用户变量的表达式求值的次序为 未定义,并且 可能会根据给定语句中包含的元素进行更改; 另外,这个顺序不保证在MySQL服务器的 版本之间是一样的。

http://dev.mysql.com/doc/refman/5.0/en/user-variables.html

您需要再次重复表达式或使用子查询

+0

MySQL会执行两次计算吗? – Petah 2013-03-27 22:39:23

+0

这不是一个记录的优化,所以我不会在这方面算很多,尤其是因为对优化的关注通常集中在连接上。测试它不应该很难。你也可以选择使用子查询来避免双重计算,但可能需要更多的内存(也取决于优化器)。 – koriander 2013-03-27 23:01:27

-1

只是需要对其进行设置:

SELECT 
    YEAR(date_of_spend), 
    @current := SUM(spend_amount), 
    @half := (SUM(spend_amount)/2), 
    (@current - @half) 
FROM `sales_data`, 
    (SELECT @current := 0, @half := 0) r 
GROUP BY YEAR(date_of_spend) 

See the demo

+0

,只是让'@current - @ half'返回0。他们正在行3和4 – Petah 2013-03-27 20:59:40

+1

@Petah设置看看[在这个演示](http://sqlfiddle.com/#!2/19182/3)。 – Kermit 2013-03-27 21:01:12

+0

是的我知道如果我改变了出来使用该功能,而不是它会工作的变量。然而,这是一个简化的例子,在实践中计算量要大得多。 – Petah 2013-03-27 21:02:40

相关问题