2014-07-02 76 views
0

我有一個很好的基本分頁查詢,它可以正常工作,直到我將DISTINCT放在其中一列上。CakePHP paginate造成奇怪的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') 
); 

爲什麼會在「字段」選項之旅了DISTINCT關鍵字的任何與其他列?

這對我沒有任何意義。

回答

0

如果你的意思是「它不起作用」,儘管有不同的列,你會得到多個消息具有相同的sender_id ...然後,原因是因爲當使用distinct列的多個列時,它看起來用於所有列的獨特組合。 Message.created,Message.modified和Message.id在大部分或全部時間內每行都是唯一的,所以這些列本身將使您的字段組合不同​​。改爲嘗試使用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'), 
); 
+0

我確實首先使用'group',但'order'被忽略。但至少現在我明白爲什麼DISTINCT在這種情況下不起作用。是否可以將DISTINCT關鍵字應用於一列以使其起作用? 或者還有其他解決方案嗎?這很令人沮喪。 – Botch

+0

據我所知,如果您在mysql查詢中使用'by x by x order by group',它將被排序。也許CakePHP生成的查詢不包括按順序。所以你應該檢查它正在創建的實際查詢。 – Kai