如何获取 GROUP BY 查询的总行数?

2022-08-30 11:20:58

从 PDO 手册中:

PDOStatement::rowCount() 返回受相应 PDOStatement 对象执行的最后一个 DELETE、INSERT 或 UPDATE 语句影响的行数

如果关联的 PDOStatement 执行的最后一个 SQL 语句是 SELECT 语句,则某些数据库可能会返回该语句返回的行数。但是,并非所有数据库都保证此行为,因此不应依赖可移植应用程序。

我最近才发现这一点。我刚刚将我的数据库抽象层更改为不再使用,因为只需查询实际行然后计算结果会更有效率。现在PDO不支持它!?SELECT COUNT(1) ...

我不对MySQL和PgSQL使用PDO,但我对SQLite使用。有没有办法(不完全改变dbal回来)在PDO中像这样计算行数?在MySQL中,这将是这样的:

$q = $db->query('SELECT a, b, c FROM tbl WHERE oele = 2 GROUP BY boele');
$rows = $q->num_rows;
// and now use $q to get actual data

使用MySQLi和PgSQL驱动程序,这是可能的。对于所有PDO,它不是!?

PS. 我最初的解决方案是扩展SQLResult->count方法(我自己的)来替换并返回该数字(非常低效,但仅适用于SQLite PDO)。不过,这还不够好,因为在上面的示例查询中,查询是 一个 ,这将改变 .SELECT ... FROMSELECT COUNT(1) FROMGROUP BYCOUNT(1)


答案 1

这是您的解决方案

$sql="SELECT count(*) FROM [tablename] WHERE key == ? ";
$sth = $this->db->prepare($sql);
$sth->execute(array($key));
$rows = $sth->fetch(PDO::FETCH_NUM);
echo $rows[0];

答案 2

这有点内存效率低下,但如果你无论如何都在使用数据,我经常使用它:

$rows = $q->fetchAll();
$num_rows = count($rows);

推荐