如何使用具有最小/最大功能的@variable?

时间:2011-08-24 16:04:41

标签: mysql

编辑:缩小问题范围。这是一个更简单的例子:

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,如何才能

2 个答案:

答案 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的聚合函数, 这是不可行的

来自select的用户定义变量不可靠(我使用成为粉丝)

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选择具有不同评估顺序的执行计划。