Разбиение на страницы CakePHP, вызывающее странное поведение

#php #mysql #cakephp #pagination

#php #mysql #cakephp #разбиение на страницы

Вопрос:

У меня есть довольно простой запрос на разбиение на страницы, который работает нормально, пока я не добавлю DISTINCT в один из столбцов.

Работает следующее:

 $this->paginate = array(
    'conditions' => array(Message.recipient_id' => $this->Auth->user('id')),
    'fields' => array(
        'DISTINCT Message.sender_id',
        'Message.recipient_id',
        'Message.thread_id',
    ),
    'limit' => 15,
    'order' => array('Message.created' => 'DESC')
);
  

Этот запрос не работает:

 $this->paginate = array(
    'conditions' => array(Message.recipient_id' => $this->Auth->user('id')),
    'fields' => array(
        'DISTINCT Message.sender_id',
        'Message.recipient_id',
        'Message.thread_id',
        // If I add any of the following columns, the DISTINCT doesn't work at all
        'Message.created',
        'Message.modified',
        'Message.id'
    ),
    'limit' => 15,
    'order' => array('Message.created' => 'DESC')
);
  

Почему какой-либо из этих других столбцов в опции ‘fields’ отключает ключевое слово DISTINCT?

Для меня это не имеет никакого смысла.

Ответ №1:

Если вы подразумеваете под «это не работает», что, несмотря на отдельный столбец, вы получаете несколько сообщений с одним и тем же идентификатором отправителя… Тогда причина этого в том, что при использовании нескольких столбцов с ключевым словом distinct он ищет уникальные комбинации всех столбцов. Сообщение.создано, сообщение.изменено и Message.id они будут уникальными для каждой строки большую часть или все время, поэтому эти столбцы сами по себе сделают ваши комбинации полей отличными. Попробуйте вместо этого использовать group by Message.sender_id.

 $this->paginate = array(
    'conditions' => array(Message.recipient_id' => $this->Auth->user('id')),
    'fields' => array(
        'Message.sender_id',
        'Message.recipient_id',
        'Message.thread_id',
        'Message.created',
        'Message.modified',
        'Message.id'
    ),
    'limit' => 15,
    'order' => array('Message.created' => 'DESC'),
    'group' => array('Message.sender_id'),
);
  

Комментарии:

1. Сначала я использовал ‘group’, но затем ‘order’ был проигнорирован. Но, по крайней мере, теперь я понимаю, почему DISTINCT в этом случае не работает. Возможно ли просто применить ключевое слово DISTINCT к одному столбцу, чтобы оно работало? Или есть альтернативное решение для этого? Это довольно неприятно.

2. Насколько я знаю, если вы используете group by x order by x , в запросе mysql он будет упорядочен. Возможно, запрос, который генерирует CakePHP, не включает order by . Поэтому вам следует проверить, какой фактический запрос он создает.