簡體   English   中英

循環內的MySQL查詢和遞歸超時

[英]MySQL query within loop and recursive timing out

我正在嘗試在下面的代碼中執行以下操作:

  • 從wrnt表中獲取“ est_no,wo_no,wt_no”。

  • 從wrnt表中獲取的每個est_no,從最舊表中獲取“ 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();

?>

感謝和問候

為什么不這樣組合選擇語句?

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語句,可以避免許多循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM