SQL / PHP - 在while循环中优化查询

时间:2014-08-24 16:39:53

标签: php mysql sql join

我有一个相当简单的查询:

$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'];的所有数据

我在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

1 个答案:

答案 0 :(得分:0)

您的用户表上有一个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语句,以确保获得所需的数据。