我找不到一个简单的解决方案。
我有一个数组,其中键是旧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 ......
答案 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解决方案”,这个答案不再是最好的方法..