如果数组值中的数组键,Mysql更新

时间:2015-03-26 10:00:40

标签: php mysql

我找不到一个简单的解决方案。

我有一个数组,其中键是旧ID,值是新ID:

[
 12 => 42,
 13 => 43,
 ... => ...
]

我的行有2个ID字段(不是主要字段,它存储具有明确角色的用户的ID)

我需要使用数组值更新字段,如果它的实际值是数组键。

如果我的行是:

role_1_id : 12
role_2_id : 13

必须更新为

role_1_id : 42
role_2_id : 43

有没有办法只使用SQL轻松完成?

编辑: 当你给出数组作为参数时,我正在寻找的东西可以与PHP函数str_replace进行比较:

str_replace([12, 13], [42, 43], $row);

但是完整的SQL ......

2 个答案:

答案 0 :(得分:1)

一种方法是迭代数组,为每个元素执行以下SQL:

UPDATE myTable SET myColumn = :newValue WHERE myColumn = :oldValue

因此,例如,使用PDO:

$pdo = new PDO('mysql:dbname='.DBNAME, USERNAME, PASSWORD);

$cmd = $pdo->prepare('
  UPDATE myTable
  SET    myColumn = :newValue
  WHERE  myColumn = :oldValue
');

$cmd->bindParam(':oldValue', $old, PDO::PARAM_INT);
$cmd->bindParam(':newValue', $new, PDO::PARAM_INT);

foreach ($array as $old => $new) $cmd->execute();

当然,如果要确保它们是原子的,那么您可以将这些操作包装在数据库事务中。或者,您可以将整个操作表示为单个更新:

UPDATE myTable
SET    myColumn = CASE myColumn
         WHEN :oldValue1 THEN :newValue1
         WHEN :oldValue2 THEN :newValue2
         -- etc
       END
WHERE  myColumn IN (:oldValue1, :oldValue2, ...)

我将让您自己解决如何在PHP中构建此类SQL。

答案 1 :(得分:0)

这几乎看起来太简单了

foreach ($arr as $key => $value) {
    //Update database where $key is the old id and $value the new id
}

编辑: 好的......看到你编辑了你的问题以要求“唯一的SQL解决方案”,这个答案不再是最好的方法..