Edited at

GROUP BYした結果、対象が何件あるか調べる #PostgreSQL #CakePHP

More than 3 years have passed since last update.


これは何か?

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);