2017-02-07 13 views
1

IDが$ids=['key1'=>'value1','key2'=>'value']のような配列の場合、MySqlテーブルを更新する可能性はありますか? $idsキーはMySqlテーブルのIDです! $ids配列の値を設定したMysql

私がすることができますループと

foreach($ids as $key=>$value) 
    do_query(UPDATE table SET column=$value WHERE $id=$key); 

ような何かをしかしcount($ids)クエリを行うにはない、1つのクエリですべての更新を行うために何かをしたいです!

+1

ん。あなたは、1つのクエリ内のすべての更新を行うことはできません..あなたはループを使用する必要があります.. – scaisEdge

答えて

0

ことは、これを試してみてください。

$idsIn=''; 
$ids=['key1'=>'value1','key2'=>'value']; 
$case=''; 
foreach($ids as $key=>$value){ 
    $idsIn.=($idsIn=='')?"'$key'":','."'$key'"; 
    $case.=" WHEN '$key' THEN '$value'"; 
} 

$sql = "UPDATE table set column= (CASE id $case END) WHERE id in($idsIn)"; 

リターン:

UPDATE table set column= (CASE id WHEN 'key1' THEN 'value1' WHEN 'key2' THEN 'value' END) WHERE id in('key1','key2') 
+1

これは私が欲しいものです!もう1つの質問ですが、もし200個以上のIDを配列していれば、これはより速く、より速い方法になります。各IDに対して200個のクエリがあり、データベースは(1.000.000以上の)大きなものですか? – squareCircle

+0

ここにはhttp://stackoverflow.com/a/13505803/7416478、ありがとうございます。 –

0

forをループして文を含む巨大な文字列を生成し、すべてのループでWHERE句の別の条件を追加します。このようなもの:

$length = count($ids); 
$statement = "UPDATE table set column=$value"; 
for ($i = 0; $i<$length; $i++){ 
if ($i == 0){ //checking if it is the first loop 
$statement.= " WHERE $id = $ids[$i]"; 
} 
else{ 
$statement.= " OR $ id = $ids[$i]"; 
} 
} 

次に、$ statementに基づいてクエリを実行します。私はそれが最善のことではないと信じていますが、私はあなたの問題を解決すると信じています。

0

"1,2,3,4,5"のように、あなたが既に持っている配列から更新したいIDを持つ昏睡区切り文字列を生成しようとする可能性があります。これはmysqlでバッチ更新を行うことができます

update table 
set column = 'new value' 
where id in (1, 2, 3, 4, 5); 

このクエリを文字列として生成し、idsを連結してPHPで実行してください。

関連する問題