提问人:Jackwiz007 提问时间:6/23/2021 最后编辑:DharmanJackwiz007 更新时间:6/23/2021 访问量:35
我必须在查询 1 中遍历 9600 个 DISTINCT 域,并在查询 2 中更新第二个表中的 id
I have to loop through 9600 DISTINCT Domains in query 1 and Update an id in a second table in Query 2
问:
查询需要很长时间才能更新第二个表中的所有域。
也许有一种更有效的方法来解决这个问题?
$mysqli = new mysqli("localhost","xxxx","xxxx","xxx");
if ($mysqli -> connect_errno) {
echo "Failed to connect to MySQL: " . $mysqli -> connect_error;
exit();
}
// Perform queries
$result = $mysqli->query(SELECT DISTINCT dom FROM pmcts_mt_pipeline_details);
$rows = $result->fetch_all(MYSQLI_ASSOC);
foreach ($rows as $row) {
$dom = $row['dom'];
$mysqli->query("UPDATE pmcts_email_marketing_companies_pharma_all_unique SET id_ind_mailer=1 WHERE email_dom='$dom' AND (mailerdaemon=0 AND mail_excluded=0 AND unsubscribe=0 AND changeto=0)");
}
答:
0赞
Martijn
6/23/2021
#1
慢的可能不是查询,而是循环。在PHP中循环很慢。
您想将一个值更新到所有匹配的行,您可以使用 IN():
$result = $mysqli->query(SELECT DISTINCT dom FROM pmcts_mt_pipeline_details);
$rows = $result->fetch_all(MYSQLI_ASSOC);
$doms = array_column($rows, 'dom'); // *
$domsString = implode("','", $doms)
* 我不是 100% 关于数组列,但目标是获取数组中的所有值
UPDATE pmcts_email_marketing_companies_pharma_all_unique
SET id_ind_mailer=1
WHERE email_dom IN ('".$domsString."')
AND (
mailerdaemon=0
AND mail_excluded=0
AND unsubscribe=0
AND changeto=0
)
注意:我假设您可以控制$dom值,并且它们对 mysql 来说是干净和安全的。如果它们能够被用户输入操作,请确保你进行了消毒,或者更好的是:使用准备好的语句。
评论
0赞
Nico Haase
6/23/2021
我希望没有一个值包含引号......dom
1赞
Martijn
6/23/2021
使用适当的框架工作了一段时间,手动消毒有时会让我忘记。我已将其添加到我的答案中
1赞
Jackwiz007
6/23/2021
非常感谢Martjin,非常有用。我唯一需要更改的是:''' $doms = array_column($rows, 'dom');然后它工作得很好,速度很快。```
0赞
Jackwiz007
6/23/2021
dom 值已保存
评论
UPDATE