我可以使用在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)
我可以使用在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)
号根据MySQL手册:
作为一般规则,你不应该赋值给一个用户变量 和读取相同的语句中的值。您可能会得到您期望的 结果,但这不能保证。对涉及用户变量的表达式求值的次序为 未定义,并且 可能会根据给定语句中包含的元素进行更改; 另外,这个顺序不保证在MySQL服务器的 版本之间是一样的。
http://dev.mysql.com/doc/refman/5.0/en/user-variables.html
您需要再次重复表达式或使用子查询
只是需要对其进行设置:
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)
MySQL会执行两次计算吗? – Petah 2013-03-27 22:39:23
这不是一个记录的优化,所以我不会在这方面算很多,尤其是因为对优化的关注通常集中在连接上。测试它不应该很难。你也可以选择使用子查询来避免双重计算,但可能需要更多的内存(也取决于优化器)。 – koriander 2013-03-27 23:01:27