2009-08-28 12 views
-1

条件の列の値のベースを更新したい場合、私はちょうどsimpel +1 -1の場合に適切なPHP呼び出しまたはORMの同等語に変換する):SQL/PHPでの複数条件の一括更新

UPDATE articles SET STATUS = 0 WHERE STATUS = 1; 

しかし、今の問題は、私が欲しいということです、元statusに基づいて、辞書からstatusの新しい値を推測します。辞書が次のようなものであると仮定します。

dict['1']='3' 
dict['12']='2' 
dict['6']='2' 

キーと値のペアには関係はありません。 dictはPHPディクショナリオブジェクトです。その意味は "in memory dictionary"です。

このクエリの書き方は?

編集:質問編集。私は適切に質問をフレーム化しなかった...申し訳ありません!

+0

ステータスがすでに最大値に達している場合はどうなりますか? – crunchdog

+1

ここに私の状況を反映させるための質問を更新しました。 – Graviton

+0

メモリ内の辞書の場合は、どこから更新を実行していますか?何らかの種類のアプリケーションですか?辞書をデータベースのテーブルに書き出す方法はありますか?そして、私の答えでクエリを使ってそれを更新してください。 – SqlRyan

答えて

1

使用サブクエリは:もちろん

UPDATE articles AR SET status = (SELECT value FROM dict WHERE key = AR.status) 

、私はあなたが辞書は、データベースに保存されていることを前提としています。 - 「既存のステータスを持つ「状態」と呼ばれる1、および1つは呼ば

UPDATE articles 
    SET status = n.new 
    FROM articles a 
    JOIN NewStatus n 
    ON a.status = n.status 

こうすることで、あなたは2つの列を持っていた「NewStatus」と呼ばれる第二のテーブルを持っていると思います。このような何かについてどのように

+0

良い試しですが、そのdictはデータベーステーブルではありません - それはメモリ辞書です – Graviton

+1

テーブルの場合は、サブクエリの代わりに結合を使用して行うことができます。サブクエリはサーバーに課税されることが大幅に減ります。 – SqlRyan

+0

@rwmnau:良い点;) @Ngu Soon Hui:メモリ辞書の意味は? – samuil

1

あなたがそれを更新したいと思う状態を持っていた「新しい」。そのテーブルに加わって、あなたの更新を行い、それがそれを解決するはずです。また、更新したくないステータスがある場合は、それらをNewStatusテーブルに含めないでください。更新ステートメントでスキップされます。

質問が修正されたように見えます。その点が不明な場合は、教えてください。

4

マッピングの数が少ない場合は、caseステートメントを使用できます。

BEGIN TRAN 

UPDATE articles 
SET status = 
     case 
      when status=1 then 3 
      when status=12 or status=6 then 2 
      else status --leave it unchanged if it doesn't match a case 
     end 

--COMMIT OR ROLLBACK 

rwmnau

+0

これは私の最初の考えでしたが、私はそのテーブルが彼の例からどれだけ大きかったかは分かりませんでした。それが一度限りのもので、テーブルが管理可能なサイズであれば、これが最も簡単な方法かもしれません。 – SqlRyan

1

により示唆されるようにあなたの質問が不明確であり、あなたは、あなたがこのような何か(擬似のJava)を行うことができ、コードやSQLを混合しているように見えるので、それ以外の場合は、マッピングテーブルのアプローチを取る:

StringBuilder sb = new StringBulder(); 

for (Map.Entry<Integer,Integer> entry : codes.entrySet) { 

    sb.append(
     String.format("UPDATE articles SET Status=%s WHERE Status=%s\n", entry.getValue(), entry.getKey() 
     ); 

} 

String sqlToExecute = sb.toString(); 
System.out.println(sqlToExecute); 

これは、変更を行うために実行するSQLを提供します。このコードがもう1つの問題になる場合は、文字列の書式を取り除き、代わりにprepared statementを使用してください。

+0

これは私が欲しいものです – Graviton