我必须在查询 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

提问人:Jackwiz007 提问时间:6/23/2021 最后编辑:DharmanJackwiz007 更新时间:6/23/2021 访问量:35

问:

查询需要很长时间才能更新第二个表中的所有域。

也许有一种更有效的方法来解决这个问题?

$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)");
}
php mysqli foreach

评论

1赞 Nico Haase 6/23/2021
您尝试过如何解决问题?为什么需要读取所有列并运行单独的查询?为什么不直接用一个查询来做这一切呢?UPDATE
1赞 Gabriel Heming 6/23/2021
似乎来自SELECT的UPDATE应该可以解决您的问题。
0赞 Jackwiz007 6/24/2021
我什至循环到 40.000 个域,太棒了!
0赞 Jackwiz007 6/24/2021
@NicoHaase:我用了Martijn的提示。我只对这个建议进行了一些小的修改。不使用 foreach 循环,这是导致它急剧减慢的原因。

答:

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 值已保存