2009-06-11 95 views
7

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

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

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

$noOfRows = ???; 

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

    // processing 
} 
+0

是的,我改了称呼,谢谢。 – MichaelICE 2009-06-11 20:28:23

回答

2

使用使用fetchall()

使用fetchall返回一个数组,所以你可以做这样的事情:

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

不要贬低Byron - 只要记住,Mike,如果您不使用所有行的数据,那么效率会非常低下,并且对COUNT行执行额外的查询会更好。 – 2009-06-11 21:00:32

0

如果要返回的整个结果在SQL查询中设置,你可以做一个fetchAll()而不是一个fetch(),然后count()阵列中的项目数从fetchAll()返回。

但是,如果您正在使用MySQL LIMIT子句或同等语句进行分页,则只会获得针对该查询(页面)返回的项目数的计数。在这种情况下,如果没有在SQL中执行COUNT(),则无法获得全部计数结果。您只能根据数据库的结果集进行计算。

12

它仍然需要另一个查询,但与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()'); 
0

Kekoa是错误的。

如果你把那个SQL_CALC_FOUND_ROWS,然后如果你把一个限制,你会得到全部行数(不受限制)。

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

我希望这可以帮助你。

BornForCode

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

相关问题