2017-02-07 3 views
1

Есть ли возможность обновить таблицу MySql, если идентификаторы в массиве равны $ids=['key1'=>'value1','key2'=>'value']. $ids ключи являются идентификаторами в таблице MySql!Установленное значение Mysql с массивом

я могу перебрать $ids и сделать что-то вроде

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

Но хочется чего-то, чтобы сделать все обновления в одном запросе, а не делать count($ids) запросов!

+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

это то, что я хочу! Еще один вопрос: если у меня есть массив около 200 или более идентификаторов, это будет быстрее или быстрее, если бы у меня было 200 запросов по одному для каждого идентификатора, а база данных большая (более 1000 000 строк)? – squareCircle

+0

Вы можете увидеть здесь http://stackoverflow.com/a/13505803/7416478, спасибо. –

0

Чтобы создать гигантскую строку, содержащую ваш оператор, вы можете выполнить цикл, и в каждом цикле вы добавили бы еще одно условие для предложения 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», вы можете выполнить пакетное обновление в mysql как это:

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

Просто генерировать этот запрос в виде строки и конкатенации идентификаторов и выполнить его в PHP.

Смежные вопросы