2

問題: MySQL ストアド プロシージャがあり、プロシージャが呼び出されるたびにユーザー変数を 0 にリセットしたいのですが、変数は前回の実行ごとにその値を記憶しているようで、ゼロに初期化できません。

詳細:データ テーブル ( と呼ばれるdata) があり、そこから読み取り、別のテーブル ( と呼ばれる) で 1 対 1 の相関関係でレコードを生成しますresults。これは、Insert Select ステートメントを使用するストアド プロシージャで行います。@mycount行ごとにインクリメントするユーザー変数も使用します。これが私のコードの簡略版です:

DELIMITER //
CREATE PROCEDURE doSomething
BEGIN
    SET @mycount := 0;
    INSERT INTO results (data_id, mycounter)
        SELECT data.id, (@mycount := @mycount+1)
        FROM data LEFT JOIN results ON data.id = results.data_id
        WHERE ... GROUP BY ...
        HAVING ...
        ORDER BY ...;
END //
DELIMITER ;

分析:@mycountこれは、実行するたびにゼロにリセットする必要があり、SET上記のステートメントがそれを達成していないことを除いて、ほぼ希望どおりに機能します。@mycountデバッグ時に、前回のストアド プロシージャの実行からの最後の値が常に記憶されていることがわかります。また、挿入後にゼロに設定しようとしました。

ノート:

  1. @行番号をインクリメントして追跡するために変数を使用しています。おそらくここに別のオプションがありますか?
  2. この問題は、Having 句に関連しているようです。having 句を使用せずに同様の別のクエリを実行すると、変数は問題なくリセットされます。

質問:@mycount毎回実行する前にゼロに設定できないのはなぜですか? それがリセットされていて、Having 句が予期しないカウントを引き起こしているだけの場合、SQL を書き直すより良い方法はありますか?

これはかなりあいまいに思えるので、誰かが似たようなことに遭遇したことを願っています。

4

3 に答える 3

0

次のSQL Fiddleでは、あなたが提起した問題を再現できません。理論的には期待どおりに動作します。

アップデート

試す:

DELIMITER //

CREATE PROCEDURE doSomething()
BEGIN
    SET @mycount := 0;
    INSERT INTO results (data_id, mycounter)
        SELECT der.id, (@mycount := @mycount + 1)
        FROM (
            SELECT data.id
            FROM data
                LEFT JOIN results ON data.id = results.data_id
            WHERE ...
            GROUP BY ...
            HAVING ...
            ORDER BY ...
        ) der;
END //

DELIMITER ;
于 2013-08-10T11:07:42.523 に答える