2009-06-11 53 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

相關問題