簡體   English   中英

SQL / PHP-在while循環中優化查詢

[英]SQL / PHP - Optimize query inside a while loop

我有一個相當簡單的查詢:

$r = $dbh->prepare("SELECT user FROM this_users_rented WHERE user_by=:user LIMIT $offset, $rowsperpage");
$r->bindParam(':user', $userdata['username']);
$r->execute();

($ offset和$ rowsperpage表示列表的偏移量,基於當前頁面,每頁應顯示多少記錄。(示例:0,100))

這將從this_users_rented中收集所有數據,其中user_by = $userdata['username']; user_by

我在WHILE LOOP中運行此查詢:

    while($data=$r->fetch()):
      //Get data from table: this_users_rented to print out in the while loop.
          $stmt = $dbh->prepare("SELECT * FROM xeon_users_rented_stats WHERE urs_user=:user");
          $stmt->bindParam(':user', $data['user']);
          $stmt->execute();
          $refStat = $stmt->fetch();

    endwhile;

因此,想象一下$r query中有數百條記錄-產生了數百個要運行的查詢(由於$stmt query缺乏優化)

所以我的問題是,如何優化$stmt query

您的用戶表上有一個LIMIT子句,因此您可以使用以下技巧來克服MySQL的限制,即您不能在子選擇中使用LIMIT子句來准備語句:

$r = $dbh->prepare("
               SELECT x.* 
               FROM xeon_users_rented_stats x
               INNER JOIN (
                   SELECT 
                       user_by 
                   FROM this_users_rented 
                   WHERE user_by = :user 
                   LIMIT $offset, $rowsperpage
               ) t
               ON x.urs_user = t.user_by
               ORDER BY x.urs_user;"
      );
$r->bindParam(':user', $userdata['username']);
$r->execute();
while($refstat=$r->fetch()){
    // do what you want to do ...
}

此技巧將子選擇更改為物化派生表,您可以在其中使用LIMIT。

注意:

當然,您應該首先在sql客戶端中測試sql語句,以確保獲得所需的數據。

暫無
暫無

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

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