5

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

簡単な例:

SET @a = 1;

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

結果:

+--------+------+
| | 合計 | @a |
+--------+------+
| | 2 | 1 |
+--------+------+

ここで @a は 2 になると思います。

その他の例:

SELECT @b := SUM(1 + 1) AS sum, @b;
+--------+------+
| | 合計 | @b |
+--------+------+
| | 2 | ヌル |
+--------+------+

@b はクエリの前に設定されていなかったため、現在は NULL です。

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

4

2 に答える 2

7

ドキュメントに記載されているように:

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

あなたの質問の2番目の部分に。次のようにクエリ内で初期化できます@variable(サブクエリが最初に評価されます)。

SELECT @b := SUM(1 + 1) AS sum, @b FROM (SELECT @b:=0) b
于 2012-05-11T13:32:38.690 に答える