一尘不染

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

php

从PDO手册中:

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

如果关联的PDOStatement执行的最后一条SQL语句是 SELECT 语句,则 某些数据库可能返回该 语句 返回的行数
。但是, 并非对于所有数据库 都可以 保证 此行为 并且便携式应用程序不应该依赖此行为。

我是最近才发现的。我刚刚将数据库抽象层更改为不再使用SELECT COUNT(1) ...,因为仅对实际行进行查询然后对结果进行计数将更加有效。现在PDO不支持!!

我不将PDO用于MySQL和Pg​​SQL,但用于SQLite。有没有一种方法(没有完全改变dbal
back)在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->计数方法(我自己),以取代SELECT ... FROMSELECT COUNT(1) FROM和刚刚返回(非常低效的,但只限于SQLite PDO)这个数字。但是,这还不够好,因为在上面的示例查询中是a GROUP BY,这将更改的含义/功能COUNT(1)


阅读 572

收藏
2020-05-26

共1个答案

一尘不染

我最终使用的方法非常简单:

$query = 'SELECT a, b, c FROM tbl WHERE oele = 2 GROUP BY boele';
$nrows = $db->query("SELECT COUNT(1) FROM ($query) x")->fetchColumn();

可能不是最有效的方法,但它似乎是万无一失的,因为它实际上可以计算原始查询的结果。

2020-05-26