2016-06-25 32 views
0

1つのクエリで新しいデータでmysqlデータベースの10行を更新しようとしています。 私はここでこれを研究したMYSQL - UPDATE multiple rows with different values in one queryそしてここにSQL string value spanning multiple lines in queryそしてここにSQL Server: CASE WHEN OR THEN ELSE END => the OR is not supported。 私は 'mt5'というテーブルに 'pair'と 'price'という列を持っています。変数$ res [number]が新しいpriceの値を保持している場合、priceは既存の値よりも大きい場合にのみデータベースのレジスタを増加させます。 このタイプのレイアウトは動作します:複数の行の更新用にSQLクエリを構成する方法

$q = "UPDATE MT5 SET price = CASE WHEN '$res[10]' > price THEN '$res[10]' ELSE price END WHERE pair in ('EUR/USD')"; 
$r = mysqli_query ($dbc, $q) or trigger_error("Query: $q\n<br />MySQL Error: " . mysqli_error($dbc));// Register the values & redirect: 
$q = "UPDATE MT5 SET price = CASE WHEN '$res[11]' > price THEN '$res[11]' ELSE price END WHERE pair in ('USD/JPY')"; 
$r = mysqli_query ($dbc, $q) or trigger_error("Query: $q\n<br />MySQL Error: " . mysqli_error($dbc));// Register the values & redirect: 

が、私は1つのクエリでそれをすべて持っている必要があります。このように:(しかし、これは動作しません、以下を参照)

$q = "UPDATE MT5 SET price = (CASE WHEN '$res[10]' > price THEN '$res[10]' 
            WHEN '$res[11]' > price THEN '$res[11]' 
            WHEN '$res[12]' > price THEN '$res[12]' 
            WHEN '$res[13]' > price THEN '$res[13]' 
            WHEN '$res[14]' > price THEN '$res[14]' 
            WHEN '$res[15]' > price THEN '$res[15]' 
            WHEN '$res[16]' > price THEN '$res[16]' 
            WHEN '$res[17]' > price THEN '$res[17]' 
            WHEN '$res[18]' > price THEN '$res[18]' 
            WHEN '$res[19]' > price THEN '$res[19]' 
           END) 
           WHERE pair in ('EUR/USD', 'USD/JPY', 'GBP/USD', 'EUR/GBP', 'USD/CHF', 'EUR/JPY', 'EUR/CHF', 'USD/CAD', 'AUD/USD', 'GBP/JPY')"; 
$r = mysqli_query ($dbc, $q) or trigger_error("Query: $q\n<br />MySQL Error: " . mysqli_error($dbc));// Register the values & redirect: 

今ではちょうど列価格のすべてのセルに最初の値になります(すべてのセルが[10] $ RESの値を持っている私は何を。 。間違っている私はまた、このように、最後に追加「ELSE価格」でそれを試してみました:

WHEN '$res[12]' > price THEN '$res[12]' ELSE price 

次の行と同じ....私は、様々な他の方法を試してみましたし、彼らはほとんど何も入力しないでくださいとエラーを返す

答えて

1

case式にペア条件を含めるようにしてください。

"UPDATE MT5 SET price = 
(CASE WHEN '$res[10]' > price and pair = 'EUR/USD' THEN '$res[10]' 
     WHEN '$res[11]' > price and pair = 'USD/JPY' THEN '$res[11]' 
     WHEN '$res[12]' > price and pair = 'GBP/USD' THEN '$res[12]' 
     WHEN '$res[13]' > price and pair = 'EUR/GBP' THEN '$res[13]' 
     WHEN '$res[14]' > price and pair = 'USD/CHF' THEN '$res[14]' 
     WHEN '$res[15]' > price and pair = 'EUR/JPY' THEN '$res[15]' 
     WHEN '$res[16]' > price and pair = 'EUR/CHF' THEN '$res[16]' 
     WHEN '$res[17]' > price and pair = 'USD/CAD' THEN '$res[17]' 
     WHEN '$res[18]' > price and pair = 'AUD/USD' THEN '$res[18]' 
     WHEN '$res[19]' > price and pair = 'GBP/JPY' THEN '$res[19]' 
END) 
WHERE pair in ('EUR/USD', 'USD/JPY', 'GBP/USD', 'EUR/GBP', 
       'USD/CHF', 'EUR/JPY', 'EUR/CHF', 'USD/CAD', 'AUD/USD', 'GBP/JPY')"; 
+0

はい、それは遅れて申し訳ありませんでした(答えの通貨欄にわずか2つのタイプミスがあって私の反応が遅くなりました)。 –

+0

私はそれを見て修正しました。 –

+0

@CharlesHaugheyこれを行う必要がある理由をわずかに拡張するには、case文が最初の真の条件を返すだけです。したがって、$ res [10]が他のすべての価格よりも大きければ、あなたは常にそのステートメントに最初にマッチします。だから、yよりもxよりも大きくすることを望むなら、最も制限の多い条件から始め、より包括的に展開してください。 – Matt

関連する問題