【发布时间】:2020-12-11 23:33:33
【问题描述】:
我有一张表,我必须根据这张表更新另一张表中的 6 行以匹配 id。它总共有超过 1000 条记录,所以大多数时候我都会遇到当前脚本超时错误。
我现在的做法是,我从第一个表中选择两个日期之间的 id 范围,将其存储到一个数组中,然后运行 foreach 循环在第二个表中进行更新,其中 id 相同,所以基本上我对每个 id 运行一个查询。
有什么办法可以加快这个过程吗?
我发现只有一种在 foreach 循环中生成 each 的方法
UPDATE product SET price = CASE
WHEN ID = $ID1 THEN $price1
WHEN ID = $ID1 THEN $price2
END
但我不知道如何修改它以同时更新多行而不仅仅是一个。
我的脚本代码是这样的
$sql = "SELECT * FROM `games` where (ev_tstamp >= '".$timestamp1."' and ev_tstamp <= '".$timestamp2."')";
while($row = mysqli_fetch_array($sql1)){
$one_of =[
"fix_id" =>$row['fix_id'],
"t1_res" =>$row['t1_res'],
"t2_res" =>$row['t2_res'],
"ht_res_t1" =>$row['ht_res_t1'],
"ht_res_t2" =>$row['ht_res_t2'],
"y_card_t1" =>$row['y_card_t1'],
"y_card_t2" =>$row['y_card_t2'],
"t1_corners" =>$row['t1_corners'],
"t2_corners" =>$row['t2_corners'],
"red_card_t1" =>$row['red_card_t1'],
"red_card_t2" =>$row['red_card_t2']
];
array_push($today_games,$one_of);
}
foreach($today_games as $key=>$val){
$cards_t1=$val['red_card_t1']+$val['y_card_t1'];
$cards_t2=$val['red_card_t2']+$val['y_card_t2'];
$sql = "Update sights SET t1_res='".$val['t1_res']."',
t2_res='".$val['t2_res']."', ev_tstamp='".$val['ev_tstamp']."',
ht_res_t1='".$val['ht_res_t1']."', ht_res_t2='".$val['ht_res_t2']."',
t1_corners='".$val['t1_corners']."',t2_corners='".$val['t2_corners']."',
t1_cards='".$cards_t1."',t2_cards='".$cards_t2."'
where fix_id='".$val['fix_id']."' "
}
【问题讨论】:
-
当前脚本出现超时错误。你当前的脚本是什么?
-
请出示您的桌子好吗?基于上述,您应该能够使用
join进行更新,这将极大地简化您的查询。实际上,如果我正确理解了这个问题,您的case when...声明似乎正在做一种粗略的加入。 -
以前都问过。您可以使用 INSERT INTO ... ON DUPLICATE KEY UPDATE 语法,如stackoverflow.com/questions/3432/multiple-updates-in-mysql 所述
-
第一个SQL更新查询与PHP中的更新有关?此外,由于没有使用
WHERE条件,PHP 会更新 所有 行sights。最后,看看SQL parameterization而不是乱七八糟的字符串插值, -
第一个 sql 只是选择数据,然后更新与 fix_id 匹配的另一个表,抱歉缺少那部分