#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 . Поэтому вам следует проверить, какой фактический запрос он создает.