2014-02-06 56 views
1

我有一个问题,为了分页的需要,我需要在执行原始查询之前执行一个COUNT查询,因此我将知道我将从原始查询中接收到的记录的预测数量是多少。Zend select()count

我原来的查询看起来像这样:

$select = $this->getAdapter()->select() 
      ->from(array('u' => 'user'), array('id', 'name', 'addedDate' => 'MAX(t.added_date)')) 
      ->joinLeft(array('t' => 'transaction'), 'u.id = t.user_id', array('added_date')) 
      ->group('u.id') 
      ->order('COALESCE(MAX(t.added_date), "9999-00-00 00:00:00") ASC') 

在数查询我不会获取领域,我只需要知道多少条记录将通过DB返回。有任何想法吗?

我试图在from子句中放入'count'=>'COUNT(u.id)',但它并不包括所有记录,而是主表中每条记录的连接表的原始数量,所以下计数键的结果,我看到user.id 1有例如在表3个的交易匹配

+0

为什么不使用[Zend_Paginator](http://framework.zend.com/manual/1.12/en/zend.paginator.usage.html)或[Zend \ Paginator](http://framework.zend。 COM /手动/ 2.0/EN /模块/ zend.paginator.usage.html)? –

回答

2

您可以使用两种Zend_Db_Select对象对象:

$select = $this->getAdapter()->select() 
     ->from(array('u' => 'user'), array('id', 'name', 'addedDate' => 'MAX(t.added_date)')) 
     ->joinLeft(array('t' => 'transaction'), 'u.id = t.user_id', array('added_date')) 
     ->group('u.id') 
     ->order('COALESCE(MAX(t.added_date), "9999-00-00 00:00:00") ASC'); 

$countRowsSelect = $this->getAdapter()->select() 
     ->setIntegrityCheck(false) 
     ->from(array('cnt' => $select), array('row_count' => 'COUNT(*)')); 

$countRow = $countRows->query()->fetchAll(); 
echo 'There are ' . $countRow[0]['row_count'] . 'rows!'; 

这等于SQL查询:

SELECT COUNT(*) AS row_count FROM 
(-- your query with GROUP BY here --) cnt 

然而,当你有一个完整的Zend_Db_Select对象,只要使用的是Zend_Paginator:

$paginator = new Zend_Paginator(new Zend_Paginator_Adapter_DbSelect($select); 

要容易得多。

+0

thansk,我会检查它,我知道Zend_Paginator,但我只准备基于其他人代码的实现,所以我必须坚持使用Zend_Paginator的当前接口 – olechafm

+0

它工作的很好,只是结果在$ count_row下[ 0] ['row_count'],谢谢,我会尽快投票它达到声誉> 15 – olechafm

+0

当然,我忘了我使用fetchAll()而不是fetchRow()。我编辑了我的答案。 –