これは何か?
GROUP BYした結果、対象が何件あるか調べたいときに用いた方法のメモ。
CakePHPで利用するにあたりOVER句を使う方法にした。
OVER句を使う
PostgreSQL 9.3.4でCOUNT(*) OVER ()
を使うと次のような感じ。
SELECT COUNT(*) OVER ()
FROM table
GROUP BY group_id
HAVING SUM(point) > 0
LIMIT 1;
CakePHP 2.3.9で表現すると次のような感じ。
$this->Model->virtualFields = array('cnt' => 'COUNT(*) OVER ()');
$this->Model->find('first', array(
'fields' => array(
'cnt',
),
'group' => array(
'group_id HAVING SUM(point) > 0'
),
));
OVER句を使わない、OVER句を使えない場合
OVER句が使えない場合はこんな感じ。
SELECT COUNT(*)
FROM (
SELECT group_id
FROM table
GROUP BY group_id
HAVING SUM(point) > 0
) AS t
CakePHP 2.3.9で表現すると次のような感じ。
$ds = $this->Model->getDataSource();
$query = $ds->buildStatement(array(
'table' => 'table',
'alias' => '',
'fields' => array(
'group_id',
),
'group' => array(
'group_id HAVING SUM(point) > 0'
),
), $this->Model);
$query = $ds->buildStatement(array(
'table' => '(' . $query . ')',
'alias' => 't',
'fields' => array(
'COUNT(*)',
),
), $this->Model);
$ds->query($query);