我有一个包含大约50个项目的数组。每个项目都是ID =>价格,我有一个称为产品的表,我需要将产品的价格更新为使用id引用的数组中的新价格
我可以使用foreach循环并执行以下操作
foreach($products as $ID => $price) {
$result = mysqli_query($link, "UPDATE product SET price = $price WHERE id = $ID");
}
但是这最终将导致我运行近50个查询,是否有更快的方法或更好的做法?
答案 0 :(得分:0)
您应该以以下格式创建更新案例查询:
UPDATE product SET price = CASE
WHEN ID = $ID1 THEN $price1
WHEN ID = $ID1 THEN $price2
END
您可以使用循环生成每个案例并执行单个查询。
为了安全起见,您也应该使用where子句,以防止在案例中不存在ID的行上更改价格。
所以要修改查询:
UPDATE product SET price = CASE
WHEN ID = $ID1 THEN $price1
WHEN ID = $ID1 THEN $price2
END
WHERE ID IN ($IDs)
以及一个工作示例:
$ids = array();
$cases = array();
foreach ($products as $id => $price) {
$ids[] = $id;
$cases[] = sprintf("WHEN ID=%s THEN '%s'", $id, $price);
}
$query = "UPDATE products SET PRICE CASE %s END WHERE ID IN(%s)";
$args = array(
implode(" ", $cases),
implode(", ", $ids)
);
$updateQuery = vsprintf($query, $args);
答案 1 :(得分:0)
您应该使用MYSQL的CASE语句
下面是小例子
update products set price=case id
when '6' then '2'
when '7' then '3'
end
where id in (6,7);
上述代码的作用包括案例陈述
当6 = 2解释id = 6时,然后从上面的例子中设置price = 2
$casear=array();
$incase=array();
foreach($products as $id=>$price)
{
array_push($casear, "when '$id' then '$price'");
array_push($incase,'$id');
}
$casequery= implode('',$casear);
$inquery=implode(',',$incase)
//Finally executing your query
$upquery="UPDATE Products set price=case id $casequery end where id in($inquery)";
$result=mysqli_query($link,$upquery);