我有一个相当简单的查询:
$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
?
答案 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语句,以确保获得所需的数据。