当前位置: 首页 > 面试题库 >

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

别兴国
2023-03-14
问题内容

从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)


问题答案:

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

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

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



 类似资料:
  • 问题内容: 我有以下查询,其结果对我来说是非常意外的: 它为所有行返回100。应该不同吗? 问题答案: 等于您的情况。 尝试这样的事情: update :甚至用ratio_to_report更简单

  • 问题内容: 我正在使用SQL Server 2008。 我想编写一个查询,该查询可以让我在给定的几天内进行全部活动。具体来说,我想计算过去7天每天的总票数。 我的桌子看起来像这样: 我需要我的结果看起来像这样 我的想法是我必须做这样的事情: 该查询不起作用,因为它仅计算(几乎完全相同)同时发生的选票。当然,我只想看特定的一天。我如何做到这一点? 问题答案: 将其投射为: 您的专栏是,但您只需要其中

  • 问题内容: 我有这样的查询: 上述查询^中的结果数为10行。现在,我想知道如何在此查询中获取总结果数: 如何计算此^中所有结果的数量 (与无关)? 其实我想要这个数字: 现在,我想知道如何在没有其他查询的情况下获得总结果数。 问题答案: 添加一列,例如: 如 @Tim Biegeleisen所述 : 关键字在所有其他内容之后应用,因此仍然返回正确的答案。

  • http://static.springsource.org/spring-data/data-commons/docs/1.3.2.release/api/org/springframework/data/domain/pagerequest.html http://static.springsource.org/spring-data/data-commons/docs/1.3.2.relea

  • 我正在对spark sql查询执行计划进行一些分析。explain()api打印的执行计划可读性不强。如果我们看到spark web UI,就会创建一个DAG图,该图分为作业、阶段和任务,可读性更高。是否有任何方法可以从执行计划或代码中的任何API创建该图?如果没有,是否有任何API可以从UI读取该grap?

  • 问题内容: 我试图了解mysqli扩展名,并做了谷歌,但除了php.net这是非常有用的很少信息。 现在毕竟这是我想要实现的MySQL扩展,如下所示: 用mysqli我怎么能做到这一点?我肯定我错过了很多事情。请以示例的方式帮助我,以实现我的目标。 问题答案: 使用mysqli,您可以通过以下方式进行操作(假设mysqli对象已创建- 您也可以使用过程方法,只是略有不同):