有没有办法从Zend框架的查询中获取记录数?

时间:2009-06-11 20:18:21

标签: php zend-framework zend-db

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

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

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

$noOfRows = ???;

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

  // processing
}

5 个答案:

答案 0 :(得分: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()');

答案 1 :(得分:2)

使用fetchAll()

fetchAll返回一个数组,所以你可以这样做:

$rows = $db->fetchAll("select ...");
$numRows = sizeof($rows);
foreach ($rows as $row)
{
  // process each row
}

答案 2 :(得分: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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

Kekoa错了。

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

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

我希望这会对你有所帮助。

BornForCode