2009-12-18 66 views
11

我想知道表中有多少行。我正在使用的數據庫是一個MySQL數據庫。我已經有一個Db_Table類,用於撥打電話fetchAll()。但是我不需要表中的任何信息,只需要計算行數。如何在不致電fetchAll()的情況下統計表格中的所有行?Zend_Db:如何從表中獲取行數?

回答

25
$count = $db->fetchOne('SELECT COUNT(*) AS count FROM yourTable'); 
+0

+1爲fetchOne而不是fetchRow – 2011-05-15 22:37:37

3

你可以做fetchAll認爲是有害的一個

SELECT COUNT(*) 
FROM your_table 
3
$dbo->setFetchMode(Zend_Db::FETCH_OBJ); 
$sql = 'SELECT COUNT(*) AS count FROM @table'; 
$res = $dbo->fetchAll($sql); 
// $res[0]->count contains the number of rows 
8

計數行。

這裏是如何做到這一點的Zend_Db_Select對象的方法:

$habits_table = new Habits(); /* @var $habits_table Zend_Db_Table_Abstract */ 
$select = $habits_table->select(); 
$select->from($habits_table->info(Habits::NAME), 'count(*) as COUNT'); 
$result = $habits_table->fetchRow($select); 
print_r($result['COUNT']);die; 
+0

你爲什麼說「用fetchAll計數行被認爲是有害的」? – Andrew 2009-12-18 23:44:29

+3

嗯,你正在加載你的整個表到內存... – 2009-12-19 01:12:59

2

加計數功能來爲您Zend_Db的對象要統計所有錶行

public function count() 
{ 
    return (int) $this->_table->getAdapter()->fetchOne(
     $this->_table->select()->from($this->_table, 'COUNT(id)') 
    ); 
} 
+0

不適用於過濾 - 請參閱我的答案... – 2011-06-16 05:56:50

+0

再次閱讀,問題不是過濾! – 2011-06-19 13:29:14

+0

啊。對不起:(如果你編輯你的答案(單個字符會做)我可以恢復downvote ... :) – 2011-06-21 08:24:03

4

正確的Zend-方法是使用Zend_Db_Select對象像這樣:

$sql = $table->select()->columns(array('name', 'email', 'status'))->where('status = 1')->order('name'); 
$data = $table->fetchAll($sql); 
$sql->reset('columns')->columns(new Zend_Db_Expr('COUNT(*)')); 
$count = $table->getAdapter()->fetchOne($sql); 

這是在Zend_Paginator中完成的。另一種選擇是你的列列表前增加SQL_CALC_FOUND_ROWS然後得到發現行與此查詢次數:

$count = $this->getAdapter()->fetchOne('SELECT FOUND_ROWS()'); 
+0

什麼是$表? – 2011-06-15 20:57:04

+0

它是Zend_Db_Table實例。或者它也可以是Zend_Db_Adapter。 metod在兩個。它爲DbTable返回Zend_Db_Table_Rowset,爲適配器返回數組... – 2011-06-16 05:56:11

+0

如果您需要計算已經丟失了原始結果集的作假查詢的結果,此答案尤其有用... +1 – nzn 2017-10-30 06:59:08

2

我是那種簡約的:

public function count() 
{ 
    $rows = $db->select()->from($db, 'count(*) as amt')->query()->fetchAll(); 
    return($rows[0]['amt']); 
} 

一般可以使用在所有表。