为了账号安全,请及时绑定邮箱和手机立即绑定

从循环中进行大型选择时出现超时错误

从循环中进行大型选择时出现超时错误

PHP
湖上湖 2023-09-15 18:36:38
我下面有一个简单的 php 代码$sql_items = "SELECT id FROM item_masterfile"; /* this query has 7000 rows */$result_items = mysqli_query($con,$sql_items);    while ($row_items  = mysqli_fetch_row($result_items)) {        $sql_qty = "SELECT qty FROM inventory WHERE id = ".$row_items[0];        /* rest of the code here */    }}这是可行的,但由于大量数据,我的服务器无法处理它,并且其他查询需要很长时间才能响应。我怎样才能解决这个问题?我这里的目标是批量选择?防止堵塞?我在这个过程中看到的是很多选择等待启动。我怎样才能解决这个问题?
查看完整描述

4 回答

?
慕虎7371278

TA贡献1802条经验 获得超4个赞

尝试执行以下步骤:

  1. 获取第一个查询的结果并获取 id 值,例如 (1,2,3,4,...)..

  2. 并在 where 子句之外执行带有WHERE条件IN子句的第二个查询

喜欢

$sql_items = "SELECT id FROM item_masterfile"; /* this query has 7000 rows */


$result_items = mysqli_query($con,$sql_items);

    while ($row_items  = mysqli_fetch_row($result_items)) {

        $ids[] = $row_items['id'];

    }


    $sql_qty = "SELECT qty FROM inventory WHERE id IN  ".$ids;

      /* rest of the code here */

}


查看完整回答
反对 回复 2023-09-15
?
收到一只叮咚

TA贡献1821条经验 获得超4个赞

尝试使用限制和偏移量进行批量处理,如下所示


$offset = $i * 5000; // $i is run batch number .. 1, 2, 3 etc in the foreach() loop.


if ($i == 0) {

  $offset = "";

}

$result_items="SELECT id FROM item_masterfile LIMIT 5000 OFFSET $offset;";


查看完整回答
反对 回复 2023-09-15
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

您问题中的代码显示表之间存在 one_to_one 或 one_to_many 关系,因此使用分页和 join 语句可以解决该问题。检查下面的代码希望有帮助


$sql = "

     SELECT im.id, i.qty 

     FROM item_masterfile AS im 

     JOIN inventory AS i ON 

     im.id = i.item_masterfile_id 

     LIMIT $offset, $limit

";

$result_items = mysqli_query($con,$sql);

您可以在代码中动态设置 $offset 和 $limit 并继续...


查看完整回答
反对 回复 2023-09-15
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

您应该收集数组中的所有 id,然后使用 IN 运算符将所有 id 一次性传递给查询,而不是使用循环并在其中提供 id。

示例:SELECT qty FROM inventory WHERE id IN (1,2,3,4,5). 通过这样做,您可以避免循环,并且您的代码不会因超时错误而退出。

或者

您可以在主查询中使用子查询来实现相同的效果

例子:SELECT qty FROM inventory WHERE id IN (SELECT id FROM item_masterfile)


查看完整回答
反对 回复 2023-09-15
  • 4 回答
  • 0 关注
  • 69 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信