有没有办法从Zend-framework的查询中获取记录的数量?
鉴于下面的我的泛型选择,有没有办法从Zend Framework中获取查询返回的记录数?在我的解决方案中,循环中的$ row ++是不能接受的,因为我正在使用分页(尽管它不在我的示例中)。有没有办法从Zend-framework的查询中获取记录的数量?
我也不想用“Count(*)”添加另一个查询。
$query = "Select * from Users where active = 1";
$stmt = $db->query($query);
$noOfRows = ???;
while ($row = $stmt->fetch())
{
// processing
}
使用使用fetchall()
使用fetchall返回一个数组,所以你可以做这样的事情:
$rows = $db->fetchAll("select ...");
$numRows = sizeof($rows);
foreach ($rows as $row)
{
// process each row
}
不要贬低Byron - 只要记住,Mike,如果您不使用所有行的数据,那么效率会非常低下,并且对COUNT行执行额外的查询会更好。 – 2009-06-11 21:00:32
如果要返回的整个结果在SQL查询中设置,你可以做一个fetchAll()
而不是一个fetch()
,然后count()
阵列中的项目数从fetchAll()
返回。
但是,如果您正在使用MySQL LIMIT
子句或同等语句进行分页,则只会获得针对该查询(页面)返回的项目数的计数。在这种情况下,如果没有在SQL中执行COUNT()
,则无法获得全部计数结果。您只能根据数据库的结果集进行计算。
它仍然需要另一个查询,但与MySQL有一个SELECT参数SQL_CALC_FOUND_ROWS
- 它存储在你连接一个值,然后你可以SELECT FOUND_ROWS()
注 - 您的初始查询的性能会下降,这是因为限制将在稍后处理,但可能比单独的COUNT()更快。
$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()');
Kekoa是错误的。
如果你把那个SQL_CALC_FOUND_ROWS,然后如果你把一个限制,你会得到全部行数(不受限制)。
如果你有一个简单的表,那么建议在分页中使用count(*),因为速度要快得多,但是如果你有复杂的查询,并且你的数据是许多连接的结果等等,那么我的建议是使用SQL_CALC_FOUND_ROWS。
我希望这可以帮助你。
BornForCode
很奇怪,但这只是工作:
$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
是的,我改了称呼,谢谢。 – MichaelICE 2009-06-11 20:28:23