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

Rud*_*die 44 php database sqlite pdo

从PDO手册:

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

如果关联的PDOStatement执行的最后一个SQL语句是 SELECT语句,则某些数据库可能会返回该语句返回的行数.但是,并不保证所有数据库都有这种行为,不应依赖于便携式应用程序.

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

我没有将PDO用于MySQL和Pg​​SQL,但我是为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
Run Code Online (Sandbox Code Playgroud)

使用MySQLi和PgSQL驱动程序,这是可能的.所有的PDO都不是!?

PS.我的初始解决方案是扩展SQLResult-> count方法(我自己的)以替换为SELECT ... FROM,SELECT COUNT(1) FROM并且只返回该数字(非常低效,但仅适用于SQLite PDO).但这还不够好,因为在上面的示例查询中是a GROUP BY,这会改变其含义/功能COUNT(1).

Rob*_*mer 44

这是您的解决方案

$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];
Run Code Online (Sandbox Code Playgroud)

  • @SazzadHossainKhan它是一个准备好的语句,它应该是这样的:`$ sth-> execute(array("key"=> $ key_value));```$ key_value`是在这个块之前声明的变量. (2认同)

mje*_*jec 24

它有点内存效率低但是如果你还在使用数据,我经常使用它:

$rows = $q->fetchAll();
$num_rows = count($rows);
Run Code Online (Sandbox Code Playgroud)


Rud*_*die 8

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

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

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