簡體   English   中英

如何優化查詢以更快地運行(查詢內的查詢)

[英]How can I optimize query to run faster (Query inside a Query)

此查詢大約需要 5 秒鍾才能完成。 我的意思是當我刷新或導航到頁面時,完成瀏覽器加載並顯示總計數需要 5 秒鍾。

這是我想要實現的,首先是根據empID獲取systemID(ID)的MAX值。 但是在第一個查詢結束之前,我進行了另一個查詢,它將獲取 eStatus 列上 empID 具有 JUMP 值的行。

這是為了比較 empID 的最新數據 startDate 和他之前的 JUMP endDate 的年份差異。

這是我的桌子

---|-------|-----------|------------|---------
ID | empID | startDate |   endDate  | eStatus
---|-------|-----------|------------|---------
1  |   10  | 2001-1-31 | 2001-12-31 |
2  |   10  | 2002-1-31 | 2002-12-31 | 
3  |   22  | 2001-1-31 | 2001-12-31 |
4  |   10  | 2003-1-31 | 2003-12-31 | JUMP
5  |   10  | 2004-1-31 | 2004-12-31 |
6  |   22  | 2002-1-31 | 2002-12-31 | JUMP
7  |   10  | 2005-1-31 | 2005-12-31 |
8  |   22  | 2003-1-31 | 2003-12-31 |
9  |   22  | 2004-1-31 | 2004-12-31 |
10 |   10  | 2006-1-31 | 2006-12-31 | JUMP
11 |   10  | 2007-1-31 | 2007-12-31 |
12 |   10  | 2008-1-31 | 2008-12-31 |
13 |   10  | 2009-1-31 | 2009-12-31 | JUMP
14 |   10  | 2010-1-31 | 2010-12-31 |
15 |   10  | 2011-1-31 | 2011-12-31 |

第一個查詢將按 empID 組獲取最大 ID。

---|-------|-----------|------------|---------
ID | empID | startDate |   endDate  | eStatus
---|-------|-----------|------------|---------
15 |   10  | 2011-1-31 | 2011-12-31 |
9  |   22  | 2004-1-31 | 2004-12-31 | 

第二個查詢將獲取 eStatus Col 上具有 JUMP 數據的 empID 行

---|-------|-----------|------------|---------
ID | empID | startDate |   endDate  | eStatus
---|-------|-----------|------------|---------
4  |   10  | 2003-1-31 | 2003-12-31 | JUMP
6  |   22  | 2002-1-31 | 2002-12-31 | JUMP
10 |   10  | 2006-1-31 | 2006-12-31 | JUMP
13 |   10  | 2009-1-31 | 2009-12-31 | JUMP
6  |   22  | 2002-1-31 | 2002-12-31 | JUMP

現在我可以計算第一個查詢的 startDate 和第二個查詢的 enddate 的日期差異。 如果它大於 2,它將計入我的最終計數。 非常感謝您提前並保持安全。 這是我的代碼:

<?php
$counterA= 0;
$counterB= 0;
$finalCount = 0;
                  
  $result = mysqli_query($con,"SELECT empID,endDate FROM tablerecord 
  WHERE ID IN (SELECT MAX(ID) FROM tablerecord GROUP BY empID)");
  while ($row=mysqli_fetch_assoc($result )) {
    $counterA++; //count how many result based on the above query
    $emp_max = $row['empID']; //Get emp ID based on max ID
    endDate_result = $row['endDate']; //Get endDate based on max ID
        
    $resultPrevious=mysqli_query($con,"SELECT empID,startDate FROM tablerecord
    WHERE empID = '$emp_max' AND eStatus = 'JUMP' ");
    while ($rowPrevious=mysqli_fetch_assoc($resultPrevious)) {
                      
        $counterB++; //count how many result based on the above query
                                            
        $dateA=date_create($rowPrevious['startDate']);
        $dateB=date_create($endDate_result);
                            
        $diff2=date_diff($dateA,$dateB);
        $numLenght = $diff2->y;
                      
                      if ($numLenght > 2) {
                        $finalCount++;
                      }
    }
   }
   echo $counterA;
   echo "<br>";
   echo $counterB;
   echo "<br>";
   echo $finalCount;

?>

如果我理解正確,您想要的是選擇所有具有eStatusjump

為什么不簡單地SELECT empID,startDate FROM tablerecord WHERE empID IN(SELECT MAX(ID) FROM tablerecord) AND eStatus = 'JUMP'

或者,如果您想要empID的唯一值, SELECT empID,startDate FROM tablerecord WHERE empID IN(SELECT DISTINCT(ID) FROM tablerecord) AND eStatus = 'JUMP'

我上面的所有查詢都不會產生任何結果,您可能想在查詢中嘗試多選,以一種粗略的方式一次性完成所有查詢

select * from tablerecord where empID in(SELECT empID FROM tablerecord WHERE ID IN (SELECT MAX(ID) FROM tablerecord group by empID)) and eStatus = 'JUMP'

這樣,您只需查詢一次數據庫,其余的可以用您的 PHP 代碼完成

我會使用這個查詢來獲取所有需要的數據:

# Get first and last jump for each empID
SELECT * 
FROM tablerecord t1
WHERE t1.ID = (
    SELECT MIN(t2.ID)
    FROM tablerecord t2
    WHERE t1.empID==t2.empID
) or t1.ID = (
    SELECT MAX(t3.ID)
    FROM tablerecord t3
    WHERE t1.empID==t3.empID
)

然后運行一些 PHP,比較每一對

$result = mysqli_query($con,"the_previous_query....");
$row_to_compare_with =false;
while ($row=mysqli_fetch_assoc($result )) {
        if ($row_to_compare_with == false) {
          $row_to_compare_with = $row;
        } else {
           // Compare $row_to_compare_with with $row, both having same empId
           // do your thing here...
           $row_to_compare_with = false;
        }
}

暫無
暫無

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

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