web-dev-qa-db-ja.com

個々の行ごとに複数の「where」句を使用して複数の行を更新する

次のようにテーブルを更新しようとしています:

_Update MyTable 
SET value     = 1 
WHERE game_id = 1,
      x       =-4,
      y       = 8

SET value     = 2 
WHERE game_id = 1,
      x       =-3,
      y       = 7

SET value     = 3 
WHERE game_id = 2,
      x       = 5,
      y       = 2
_

私はforeach()を実行できますが、50を超える個別のクエリが送信されるため、非常に遅くなります。これが、1つの大きなクエリに結合する理由です。

(私は各行にidを使用していますが、game_idの組み合わせ、xおよびyは、必要な行を識別するために使用するものです。)

ここで説明されているcodeIgniterのupdate_batch()関数: CodeIgniterを使用したバッチの更新 は役に立ち、ほぼ完璧ですが、1つのwhere句しか許可されないため、(私が理解して試した限り)配列を入力できません複数のwhere句を使用します。

私もこの質問を確認しました: 同じ列にMYSQL UPDATE SETが複数のWHERE句がある場合 ただし、単一の異なるWHERE句のみを含む複数の行の更新のみが可能であり、複数のWHERE句が必要です! :)

アンサーは、単純なSQLで、またはphp(およびCodeIgniter)を使用して、または別の方法で使用できます。私はこの問題を可能な限り解決したいと思います;)

私は本当にアドバイス/ヘルプを使うことができます! = D

21
Dex

CASEを使用してこれを試してみてください

Update  MyTable 
SET     value = CASE 
                     WHEN  game_id = 1 AND x = -4 AND y = 8 THEN 1
                     WHEN  game_id = 1 AND x = -3 AND y = 7 THEN 2
                     WHEN  game_id = 2 AND x =  5 AND y = 2 THEN 3
                     ELSE  value 
                END
WHERE   game_ID IN (1,2,3) AND  -- the purpose of this WHERE clause
        x IN (-4, -3, 5) AND    -- is to optimize the query by preventing from
        y IN (8,7,2)            -- performing full table scan.
46
John Woo