如何在PDO中获取不考虑限制的总行数?

11

我发现在进行二次查询以检查是否有更多结果以便显示“加载更多”按钮非常不专业。

我正在使用PDO,有没有办法在没有限制筛选条件的情况下获取总找到的行数但仍过滤结果?

当前代码:

// Show Results

$start = 0

$r=$db->prepare("SELECT * FROM locations WHERE area=:area LIMIT $start,10");
$r->execute($fields);

// See if there is more results

$r=$db->prepare("SELECT * FROM locations WHERE area=:area");
$r->execute($fields);

$offset=$start+10;
if($r->rowCount() > $offset){
echo "<div class='load'>Load More</div>";
}
1个回答

16

据我所知,只有MySQL支持:

$r=$db->prepare("SELECT SQL_CALC_FOUND_ROWS * FROM locations WHERE area=:area LIMIT $start,10");
$r->execute($fields);

var_dump($r->fetchAll());

var_dump($db->query('SELECT FOUND_ROWS();')->fetch(PDO::FETCH_COLUMN));

对于数据库服务器来说,这个操作的负担与一次查询所有记录相当。对于非MySQL用户,这个查询当然比获取所有记录的行数要好:

$r=$db->prepare("SELECT COUNT(*) FROM locations WHERE area=:area");
$r->execute($fields);
$count = $r->fetch(PDO::FETCH_COLUMN);
echo $count;

1
有人说使用SQL_CALC_FOUND_ROWS比运行两个查询慢10倍,这取决于索引和其他条件。我建议在使用之前先阅读和测试。在此处检查性能测试:https://www.percona.com/blog/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/ - TheCarver
@PaparazzoKid:是的,人们应该进行测试。然而,由于那篇文章已经有8年的历史了,我也不会相信那篇文章的内容 ;) - Wrikken

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接