鉴于下面的泛型选择,有没有办法从Zend Framework获取查询返回的记录数?循环中的$ row ++对于我的解决方案是不可接受的,因为我正在使用分页(虽然它不在我的示例中)。
我也不想用“Count(*)”添加另一个查询。
$query = "Select * from Users where active = 1";
$stmt = $db->query($query);
$noOfRows = ???;
while ($row = $stmt->fetch())
{
// processing
}
答案 0 :(得分:13)
它仍然需要另一个查询,但是对于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()');
答案 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