我正在使用PDO运行相当复杂的MySQL查询(多个LEFT JOIN
,GROUP_CONCAT
和绑定参数)。由于查询的复杂性,我在末尾添加了一个LIMIT
子句来返回一组特定的数据 - 这在我的应用程序的分页表中显示。
分页需要找到总结果数。我没有意识到这很尴尬,但已经阅读了以下内容:
SQL_CALC_FOUND_ROWS
的表现非常糟糕,所以我无法使用它。
我能想到写这个的唯一方法是使用COUNT
运行第二个查询。但是因为查询使用参数绑定(对于用户输入的搜索词),我必须在第二个查询中再次绑定它们。
我获得结果的初始查询如下所示:
// Get the results
$sql = ' '; // Complex query
$limit = ' LIMIT ' . $start . ', ' . $offset;
$stmt = $connection->prepare($sql);
// Search parameters
if (isset($search['term1'])) {
$stmt->bindValue('term1', '%' . $search['term1'] . '%');
}
if (isset($search['term2'])) {
$stmt->bindValue('term2', '%' . $search['term2'] . '%');
}
if (isset($search['term3'])) {
$stmt->bindValue('term3', '%' . $search['term3'] . '%');
}
$stmt->execute();
return $stmt->fetchAll('assoc');
现在我需要移除LIMIT
,以便我完成以下操作:
$stmt_count = $connection->prepare('SELECT COUNT(*) FROM (' . $sql . ') AS total_results');
$stmt_count->execute();
但这不起作用,因为我需要再次绑定参数。当然,有一种更有效的方法,而不是重复所有绑定到$stmt_count
??
if (isset($search['term1'])) {
$stmt_count->bindValue('term1', '%' . $search['term1'] . '%');
}
if (isset($search['term2'])) {
$stmt_count->bindValue('term2', '%' . $search['term2'] . '%');
}
if (isset($search['term3'])) {
$stmt_count->bindValue('term3', '%' . $search['term3'] . '%');
}
顺便说一句,我无法相信这样的基本内容如此困难!能够轻松了解查询结果总数是一个非常基本的要求。