7

鉴于我在下面的通用选择,有没有办法使用 Zend Framework 获取从查询返回的记录数?我的解决方案不能接受循环中的 $row++,因为我正在使用分页(尽管它不在我的示例中)。

我也不想用“Count(*)”添加另一个查询。

$query = "Select * from Users where active = 1";
$stmt = $db->query($query);

$noOfRows = ???;

while ($row = $stmt->fetch())
{

  // processing
}
4

5 回答 5

13

它仍然需要另一个查询,但是对于 MySQL,有一个 SELECT 参数SQL_CALC_FOUND_ROWS- 它在您的连接中存储一个值,然后您可以SELECT FOUND_ROWS()

注意 - 初始查询的性能会下降,因为稍后会处理限制,但它可能比单独的 COUNT() 更快。

FOUND_ROWS()

$query = "Select SQL_CALC_FOUND_ROWS * from Users where active = 1 limit 20";
$stmt = $db->query($query);

while ($row = $stmt->fetch())
{

  // processing
}

$count = $db->fetchOne('SELECT FOUND_ROWS()');
于 2009-06-11T23:17:22.490 回答
2

使用 fetchAll()

fetchAll 返回一个数组,因此您可以执行以下操作:

$rows = $db->fetchAll("select ...");
$numRows = sizeof($rows);
foreach ($rows as $row)
{
  // process each row
}
于 2009-06-11T20:32:51.997 回答
1

这很奇怪,但这很有效:

$oSelect = $oTable->select()
                ->where(...)
                ->order(...)
                ->limit(...)
$oRows = $oTable->fetchAll($oSelect);
// these two lines are the solution: we simply run the query again!
$db->query($oSelect);
$iTotal = $db->fetchOne("select FOUND_ROWS()");

我应该提到我在我的配置文件中使用了这一行:

db.profiler.enabled = true

这是一些羽毛创意的代码;但是它不起作用:

$query = $db->select()
->from('your_table', array(new Zend_Db_Expr('SQL_CALC_FOUND_ROWS id as fake_column'),'*'))
->where(...)
->limit(0, 10);

$db->query($query);

$iCount = $db->fetchOne('select FOUND_ROWS()');

也看看http://old.nabble.com/RE:-CALC_FOUND_ROWS-vs.-count%28 *%29-p16761518.html

于 2010-02-07T23:27:00.320 回答
0

如果您在 SQL 查询中返回整个结果集,您可以执行 afetchAll()而不是 a fetch(),然后count()是从 . 返回的数组中的项目数fetchAll()

但是,如果您使用 MySQLLIMIT子句或等效子句进行分页,您将只能获得为该查询(页面)返回的项目数的计数。COUNT()在这种情况下,如果不执行 in SQL,则无法获得全部结果。您只能根据数据库中的结果集进行计算。

于 2009-06-11T20:33:30.293 回答
0

可可亚错了。

如果你放了那个 SQL_CALC_FOUND_ROWS 然后如果你放了一个限制,你将获得完整的行数(不受限制的影响)。

如果你有一个简单的表,那么建议在分页中使用 count(*),因为它更快,但是如果你有复杂的查询并且你的数据是许多连接的结果等等,那么我的建议是使用 SQL_CALC_FOUND_ROWS。

我希望这可以帮助你。

为代码而生

于 2009-09-13T13:32:14.543 回答