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

SQL/PHP-在while循环中优化查询,php,mysql,sql,join,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表示基于当前页面的列表偏移量,以及每页应显示多少条记录。(示例:0100))

我有一个相当简单的问题:

$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表示基于当前页面的列表偏移量,以及每页应显示多少条记录。(示例:0100))

这将从
This\u users\u租借的
收集所有数据,其中
user\u by
是=
$userdata['username']

我正在WHILE循环中运行此查询:

    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查询
中有数百条记录,产生数百条要运行的查询(由于
$stmt查询
缺乏优化)


所以我的问题是,我如何优化
$stmt查询

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

为什么不使用联接呢?@VMai这是如何工作的?你能提供一个简单的例子,使用连接函数吗?你也应该在循环之外准备一个语句;在循环中执行此操作完全否定了准备查询的目的。准备一次,执行多次。这是表的别名
xeon\u users\u rendered\u stats
。我忘了编辑了吗。好了,谢谢!请您提供一个$r的例子,我可以在while循环中使用它。现在使用它,不会显示任何记录