ページネーションではDISTINCTではなく、GROUP BYを使う
開発環境:CakePHP2.5.1
重複したデータを省く時に使うDISTINCTですが、ページ送りで使う時には注意が必要です。
PaginatorでDISTINCT
PaginatorでDISTINCTを使うには次のように設定します。
<?php
$this->Paginator->settings = array(
'fields' => 'DISTINCT name',
);
$posts = $this->Paginator->paginate('Post');
こうすると、一見うまくデータが取得できたかに見えますが、ページ送りの部分のSQLにはDISTINCTが効いておらず、全件分のページ送りが生成されてしまいます。
PaginatorでGROUP BY
上記の問題点を解決するには、GROUP BYを利用すればいいのです。
<?php
$this->Paginator->settings = array(
'fields' => 'name',
'group' => 'name',
);
$posts = $this->Paginator->paginate('Post');
これで、データおよびページ送り共に重複データが排除されて取得できます。
