编辑:缩小问题范围。这是一个更简单的例子:
mysql> select * from table_a;
+-------+
| col_a |
+-------+
| 1 |
| 2 |
| 3 |
| 4 |
+-------+
4 rows in set (0.00 sec)
mysql> select @a:=max(col_a),@a from table_a;
+----------------+------+
| @a:=max(col_a) | @a |
+----------------+------+
| 4 | NULL |
+----------------+------+
1 row in set (0.00 sec)
为什么@a
NULL
,如何才能 ?
答案 0 :(得分:5)
MySql manual对此非常清楚,引用:
作为一般规则,您不应该为用户变量赋值并在同一语句中读取值。您可能会得到您期望的结果,但这不能保证。涉及用户变量的表达式的评估顺序是未定义的,可能会根据给定语句中包含的元素进行更改;此外,MySQL服务器版本之间的订单不保证相同。在SELECT @ a,@ a:= @ a + 1,...中,你可能会认为MySQL会首先评估@a然后再进行一次赋值。但是,更改语句(例如,通过添加GROUP BY,HAVING或ORDER BY子句)可能会导致MySQL选择具有不同评估顺序的执行计划。
答案 1 :(得分:1)
不会通过聚合函数返回的每一列都可以用于大多数情况吗?
换句话说,很难猜测你真正想要的是什么 (打算再次更新你的问题?)正常用法
select max(col_a) as anything
from table_a
order by anything;
我认为这对此有任何伤害
select max(col_a) as anything, max(col_a) as anything2,
from table_a
order by anything, anything2;
如果您尝试使用LIMIT
的聚合函数,
这是不可行的
http://dev.mysql.com/doc/refman/5.0/en/user-variables.html
作为一般规则,您永远不应将值分配给用户变量并读取同一语句中的值。您可能会得到您期望的结果,但这不能保证。涉及用户变量的表达式的评估顺序是未定义的,可能会根据给定语句中包含的元素进行更改;此外,MySQL服务器版本之间的订单不保证相同。在SELECT @ a,@ a:= @ a + 1,...中,你可能会认为MySQL会首先评估@a然后再进行一次赋值。但是,更改语句(例如,通过添加GROUP BY,HAVING或ORDER BY子句)可能会导致MySQL选择具有不同评估顺序的执行计划。