4

作为 Oracle 用户,我经常遇到这个问题,我在玩 MySql。

是以下情况:

  • id 列表 (1, 2, 3, ..., n)
  • 值列表 ('val1', 'val2', 'val3', ..., 'valn') [这些值显然与这些完全不同]
  • 前 2 个列表按顺序传递。这意味着首先传递的值对应于首先传递的id。

目标是更新所有具有相应value的表:val1 应该更新 id 1,val2 应该更新 id 2 等等......仅在一个查询中。valueid

简单的解决方案是更新 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

4

1 回答 1

2

这是使用一个查询执行此操作的一种方法。它不会是格式最漂亮的查询,但它只是一个。

<?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

于 2012-12-05T00:31:03.683 回答