phpcakephpcakephp-1.3

CAKEPHP Group by problem in paginate


CAKEPHP Group by problem in paginate..

This is my table structure

 Friends Table
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user1_id` int(11) NOT NULL DEFAULT '0',--> UserFrom
  `user2_id` int(11) NOT NULL DEFAULT '0',---> UserTo

I need to get all the unique records of one user and his user1_id = 100

There are lot of duplicate values in user2_id. I need to get the unique values While i trying this code it returns only first 12 values(according to limit). If i commented the group by line then all records are displaying (including duplicate values)

$this->paginate = array(
                    'conditions' => $conditions,
        'contain'=>array(
            'UserFrom'=>array(
                'fields'=>array(
                   'UserFrom.id',
                   'UserFrom.first_name',
                   'UserFrom.last_name',
                ),
             ),
             'UserTo'=>array(
                'fields'=>array(
                    'UserTo.id',
                    'UserTo.first_name',
                    'UserTo.last_name',
                    )
             )
            ),'limit' => 12,
            'order' => array('Friend.id' => 'desc'),
            'recursive'=>0,
            'fields'=>array('DISTINCT Friend.user2_id','Friend.*'),
            'group'=>array('UserTo.id'),
            );

This is my sql query on that page

SELECT COUNT(*) AS count FROM friends AS Friend LEFT JOIN users AS UserTo ON (Friend.user2_id = UserTo.id) LEFT JOIN users AS UserFrom ON (Friend.user1_id = UserFrom.id) WHERE UserFrom.nick_name = 'shyam' AND Friend.status = 'friend' GROUP BY UserTo.id

SELECT DISTINCT Friend.user2_id, Friend.*, UserTo.id, UserTo.first_name, UserTo.last_name, UserTo.nick_name, UserTo.name, UserTo.icon_medium, UserTo.icon_big, UserFrom.id, UserFrom.first_name, UserFrom.last_name, UserFrom.nick_name, UserFrom.name FROM friends AS Friend LEFT JOIN users AS UserTo ON (Friend.user2_id = UserTo.id) LEFT JOIN users AS UserFrom ON (Friend.user1_id = UserFrom.id) WHERE UserFrom.nick_name = 'shyam' AND Friend.status = 'friend' GROUP BY UserTo.id ORDER BY Friend.id desc LIMIT 12

1.First count query returning count properly 2.Second query if i put limit it not working properly. i.e there are 144 records in my table i need to display 12 per page.. only first page coming if i use group by and limit


Solution

  • You should have either DISTINCT or GROUP BY, not both - they're duplicating each other and probably causing problems with your query. Remove one of them and retry.

    Note: If you want to manually request pages other than 1st with $this->paginate(), add 'page' parameter with page number to your $this->paginate array, like this:

    $this->paginate = array_merge($this->paginate, array('page' => $pageNumber);
    

    However, normally you wouldn't want to do this, as paginator does this automatically (passing page variable via URL parameter to your action) as long as you use pagination controls in your view (see http://book.cakephp.org/view/1233/Pagination-in-Views).