【问题标题】:Zend select() countZend select() 计数
【发布时间】:2014-03-03 14:18:59
【问题描述】:

我有一个问题,我需要在执行原始查询之前执行一次 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')

在计数查询中我不会获取字段,我只需要知道数据库将返回多少条记录。有什么想法吗?

我尝试将'count'=>'COUNT(u.id)'放在from子句中,但它不是计算所有记录,而是计算主表每条记录的连接表中的原始拟合记录数,所以在 count 键下的结果中,我看到 user.id 1 在表事务中有 3 个匹配项

【问题讨论】:

标签: zend-framework count


【解决方案1】:

您可以使用两个 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);

这要容易得多。

【讨论】:

  • thansk,我会检查一下,我知道 Zend_Paginator,但我只是根据别人的代码准备实现,所以我必须坚持不使用 Zend_Paginator 的当前接口
  • 效果很好,只是结果低于$count_row[0]['row_count'],谢谢,我会在达到声誉> 15 后立即投票
  • 当然,我忘记了我使用的是 fetchAll() 而不是 fetchRow()。我已经编辑了我的答案。
猜你喜欢
  • 1970-01-01
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-02
  • 1970-01-01
  • 2014-11-14
  • 1970-01-01
相关资源
最近更新 更多