【问题标题】:MySQL query within loop and recursive timing out循环内的MySQL查询和递归超时
【发布时间】:2017-04-24 13:47:14
【问题描述】:

我正在尝试在以下代码中执行以下操作:

  • 从 wrnt 表中获取“est_no, wo_no, wt_no”。

  • 对于从 wrnt 表中获得的每个 est_no,从 matest 表中获取“itemcode”

  • 如果“itemcode”有前缀SE,那么我递归调用函数,直到没有前缀

  • 获得“itemcode”后,我从 itemast 表中为每个 itemcode 获取相关的“marate”

  • 最后全部插入(wo_no、wt_no、itemcode、marate)

你看到有很多循环和递归,导致运行时间很长。

有什么办法可以避免循环吗?或任何其他方式来优化脚本?

<?php
set_time_limit(200);
Class Matewr{
    private $dbhost;
    private $dbuser;
    private $dbpass;
    private $dbname;
    private $conn;
    private $dsn;
    private $pdo;
    private $insertquery='replace into compcost.matewr (workord,warrant,itemcode,marate)';
    function MateWr(){
        $this->dbhost = 'localhost';
        $this->dbuser = 'root';
        $this->dbpass='';
        $this->dbname = 'compcost';
        $this->dsn="mysql:host=$this->dbhost;dbname=$this->dbname";
        $this->pdo= new PDO ($this->dsn, $this->dbuser, $this->dbpass);

    }
    function readWrnt(){
        $idresult = $this->pdo->query("SELECT est_no, wo_no, wt_no from compcost.wrnt");
        while($row= $idresult->fetch())
        {
            $est_no=$row['est_no'];
            $wo_no= $row["wo_no"];
            $wt_no= $row["wt_no"];
            $this->getItemCodesRecursive($est_no, $wo_no, $wt_no);
            $this->pdo->query($this->insertquery);
        }
    }
    function getItemCodesRecursive($est_no, $wo_no, $wt_no){
        #$sql = "select itemcode, reccd from compcost.matest where est_no='".$est_no."'";
        $sql =$this->pdo->prepare("select itemcode from compcost.matest where est_no=?");
        $sql->execute(array($est_no));
        $rows = $sql->fetchAll();
        foreach($rows as $row){
            $itemcode = $row["itemcode"];
            if(strcasecmp(substr($itemcode, 0, 2),"se") == 0){
                $this->getItemCodesRecursive(substr($itemcode, 2), $wo_no, $wt_no);
            }
            else{
                $sql_marate=$this->pdo->prepare("select MARATE from compcost.itemmast where itemcode=?");
                $sql_marate->execute(array($itemcode));
                #$result_marate = $this->pdo->query($sql_marate);
                #if($row_marate=$result_marate->fetch(PDO::FETCH_LAZY)){
                $row_marate=$sql_marate->fetchAll();
                foreach($row_marate as $row){
                    $marate=$row["MARATE"];                         
                    $this->insertquery .= " values ('$wo_no','$wt_no','$itemcode','$marate'),";
                }                       
            }   
        }       
    }
}
$matewr = new MateWr();
$matewr->readWrnt();

?>

感谢和问候

【问题讨论】:

  • 您是否有理由要选择 1 by 1 而不是基于 item_code 的所有记录?
  • @SomeoneSpecial 如果商品代码有前缀“SE”,那么它代表另一个 est_no,这就是我进行递归调用的原因。它的混乱
  • 带SE前缀你也可以做sql语句来匹配前缀

标签: php mysql loops recursion timeout


【解决方案1】:

为什么不做这样的组合选择语句?

Select MARATE from compcost.itemmast a, compcost.matest b, compcost.wrn c WHERE c.wt_no = b.wt_no AND a.item_code = b.item_code

不清楚您的表结构,但您明白了要点...从最后一个表 (a) 中选择项目,其中 a = b 中的字段和 b = c 中的字段。

这样你就可以得到所有的记录,而无需循环那么多。

您可能需要一些其他 MySQL 语句,但通过处理您的 sql 语句可以避免许多循环。

【讨论】:

    猜你喜欢
    • 2016-09-28
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 2023-03-12
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 2014-10-01
    相关资源
    最近更新 更多