2012-05-11 7 views
5

私はSELECTクエリ内でいくつかの計算をしようとしています。私が結合されたテーブルからデータを収集するためにSUMのような関数を使い始めるまで、これはうまくいきます。MySQLのユーザ変数とSUM関数

簡体例:

SET @a = 1; 

SELECT @a := SUM(1 + 1) AS sum, @a 

結果:

+------+------+ 
| sum | @a | 
+------+------+ 
| 2 | 1 | 
+------+------+

私は@aがここ2であることを期待したいです。

その他の例:@bは、クエリの前に設定されていないため、

SELECT @b := SUM(1 + 1) AS sum, @b; 
+------+------+ 
| sum | @b | 
+------+------+ 
| 2 | NULL | 
+------+------+

が今では、NULLです。

変数がSUM関数の結果で上書きされないようです。これを修正する方法はありますか?

+0

本当に達成したいもの –

+0

@AnkitSharma:SELECTクエリ内の計算。だから、私は結果を使用する必要があります。 'SUM(1 + 1)'を計算します。 'SUM(1 + 1)'を何度も繰り返し使用する代わりに、変数_once_に格納したいと思います。 '@ a'を実行し、後で' @ a'を再利用します。 – Alec

+0

'SET @b = SUM(1 + 1)'を使用してください –

答えて

5

としてはin the documentationを次のように述べています

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

質問の第2部分に。これは、式の評価に接続されている

SELECT @b := SUM(1 + 1) AS sum, @b FROM (SELECT @b:=0) b 
+0

@bを2として返しますか? – Devart

+0

は保証されていません:)私が再投稿した文書からの抜粋は理由を説明しています。 1つのステートメントでそのようにしないでください –

+0

ありがとう、ドキュメントのその部分を逃した。私は、これらのvarsを使用して、クエリ自体で計算を行うことで時間を節約できると考えました。しかし、結果が矛盾する場合、それは実際の選択肢ではありません。私はさまざまな変数をたくさん使っているので、サブクエリもたくさんありすぎて複雑すぎます。私はちょうどMySQLで主なデータを取得し、後で必要な計算を行うためにPHPを使用しなければならないと思います。 – Alec

1

:あなたは、この(サブクエリは最初に評価を取得)などのクエリ内であなたの@variableを初期化することができます。あなたの場合、サブクエリを使用することができます -

SET @a = 1; 
SELECT sum, @a FROM 
    (SELECT @a := SUM(1 + 1) AS sum, @a) t 

+------+------+ 
| sum | @a | 
+------+------+ 
| 2 | 2 | 
+------+------+ 

詳細 - User-Defined Variables

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