ページネーションでは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');
これで、データおよびページ送り共に重複データが排除されて取得できます。