2011-08-24 27 views
5

編集:問題を絞り込んだ。ここでは単純な例です:min/max関数で@variableを使用するには?

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) 

はなぜ@aNULLあり、そしてどのように私はにそれを得ることができないになりますか?

+1

私は偽陽性の結果を与えたそのエイリアスのものをテストすると愚かな間違いを犯し、その答えを削除しました。 – nobody

答えて

5

MySql manualがquote、このことについて非常に明確である:

は、原則として、ユーザー変数に値を割り当てないと、同じステートメント内の値を読んでください。期待した結果が得られるかもしれませんが、これは保証されていません。ユーザー変数を含む式の評価の順序は未定義であり、指定されたステートメントに含まれる要素に基づいて変更される可能性があります。さらに、この順序は、MySQL Serverのリリース間で同じであることが保証されていません。 SELECT @a、@a:= @ a + 1、...では、MySQLが@aを最初に評価し、次に割り当てを行うと考えるかもしれません。ただし、(たとえば、GROUP BY句、HAVING句またはORDER BY句を追加するなどして)文を変更すると、MySQLは異なる評価順序で実行計画を選択する可能性があります。

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の集約関数を使用するINGのは信頼性がないとして

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

(Iはは、ファンであることを使用しました) ユーザ変数に値を割り当てたり、同じステートメント内の値を読み取ったりしないでください。期待した結果が得られるかもしれませんが、これは保証されていません。ユーザー変数を含む式の評価の順序は未定義であり、指定されたステートメントに含まれる要素に基づいて変更される可能性があります。さらに、この順序は、MySQL Serverのリリース間で同じであることが保証されていません。 SELECT @a、@a:= @ a + 1、...では、MySQLが@aを最初に評価し、次に割り当てを行うと考えるかもしれません。ただし、(たとえば、GROUP BY句、HAVING句またはORDER BY句を追加するなどして)文を変更すると、MySQLは異なる評価順序で実行計画を選択する可能性があります。

+0

huh ..?これについてもう少し説明できますか? 'stamp_date'は、UNIXのタイムスタンプを格納する' INT'です。変数にMIN(stamp_date)を入れたいのですが、私は自分のクエリで何度も再利用する必要があるからです。あなたのクエリは 'MIN(stamp_date)'を参照することさえしません。ああ.......あなたは最初のstamp_dateを取り除いていますが、これは分になりますか?どうしてそれがうまくいくのですが、「分」はありませんか? – mpen

+0

さて、あなたは 'substring_index'の狂気が本当に' MIN'と同じ値を取得していますが、これがどのように解決するのかわかりません。私はまだそれを変数に入れて再利用することはできません。 – mpen

+0

start_timeの値を取得したら、start_timeをソートするのに – ajreal

関連する問題