我经常面对这个问题,作为Oracle用户,玩
MySql.
是以下情况:
>一个id列表(1,2,3,…,n)
>值列表(‘val1′,’val2′,’val3′,…,’valn’)[值显然与这些值完全不同]
>之前的2个列表已通过订购.这意味着首先传递的值对应于首先传递的id.
目标是更新具有相应id的表值的所有值:val1应更新id 1,val2应更新id 2等…仅在一个查询中.
简单的解决方案是更新n次:
UPDATE `value` SET `value`='val1' WHERE id = 1;
UPDATE `value` SET `value`='val2' WHERE id = 2;
UPDATE `value` SET `value`='val3' WHERE id = 3;
...
UPDATE `value` SET `value`='valn' WHERE id = n;
但我很乐意批量更新这一切.
sqlfiddle玩一下:http://sqlfiddle.com/#!2/d02e8
最佳答案 以下是使用一个查询执行此操作的一种方法.它不是最漂亮格式的查询,但它只是一个.
<?php
$id_list = implode(',', $ids);
$whens = implode(
"\n ",
array_map(
function ($id, $value) {
return "WHEN {$id} THEN {$value}";
},
$ids,
$values
)
);
$sql = "
UPDATE value
SET value = CASE id
{$whens}
END
WHERE id IN ({$id_list})
";
?>
看我修改过的SQLFiddle.