消息列表:cakephp和mysql上的order by和group by查询

消息列表:cakephp和mysql上的order by和group by查询,mysql,cakephp,Mysql,Cakephp,我想更改我的邮件列表页面/收件箱。目前,它显示所有来自数据库的消息,就像如果有人给我发了3次消息,它将全部显示在我的收件箱中。现在我想让它变得简单,就像每个发件人在列表中只出现一次,并显示他/她发送的最新消息一样 这是我用cakephp编写的代码: $this->paginate = array( 'Message'=> array( 'conditions'=>array('Message.recipient_id'=>$this->user_id),

我想更改我的邮件列表页面/收件箱。目前,它显示所有来自数据库的消息,就像如果有人给我发了3次消息,它将全部显示在我的收件箱中。现在我想让它变得简单,就像每个发件人在列表中只出现一次,并显示他/她发送的最新消息一样

这是我用cakephp编写的代码:

$this->paginate = array(
  'Message'=> array(
    'conditions'=>array('Message.recipient_id'=>$this->user_id),
    'group' => array('Message.sender_id'),
    'order'=>'message_sent_date DESC',
    'limit'=> 20,
  )
);
这段代码的问题在于它显示了最旧的消息内容。我想这是因为“团购”总是在“订购”之前先行

我能够在mysql查询上完成它,但我不知道如何在cakephp上实现它。 我的问题是:

SELECT *
FROM(
SELECT *
FROM messages WHERE recipient_id = 114
ORDER BY message_viewed_date DESC
) AS messages 
GROUP BY sender_id
ORDER BY message_viewed_date DESC

请帮我做这个。。谢谢。

这应该可以确保您的模型设置正确:

$results = $this->Message->find('all', array(
    'conditions' => array(
        'recipient_id' => 114
    ),
    'group' => 'sender_id',
    'order' => 'message_viewed_date DESC'
));

那里不需要子查询,它没有做任何花哨的事情

我已经使用Model::query解决了这个问题

这是我的密码:

$messages = $this->Message->query("SELECT id FROM(SELECT * FROM messages WHERE recepient_id = ". $this->user_id ." ORDER BY message_sent_date DESC) AS Message GROUP BY sender_id ORDER BY message_sent_date DESC");    
for($i=0; $i<count($messages); $i++){
$message_id[$i] = $messages[$i]['Message']['id'];
}
$this->paginate = array(
    'Message'=> array(
      'conditions'=>array('Message.id' => $message_id, 'Message.recepient_id'=>$this->user_id, 'Message.hidden_on_to'=>false),
      'limit'=>20,
      'order'=>array('Message.message_sent_date' => 'DESC'),
      'recursive'=>0,
      'fields'=>array('Message.id', 'Message.message_content', 'Message.message_sent_date', 'Message.message_viewed_date', 'Sender.id', 'Sender.username')
    )
);

但是我需要子查询,因为它将使邮件列表显示每个发件人的最新邮件内容。如果我使用此代码,它将显示每个发件人最早的邮件内容。这不是一个适合StackOverflow的问题。请展示你尝试过的,你遇到的问题…等等。不只是请为我这样做。我编辑了这个问题,先生,已经有了答案,我自己解决了。我想在这里发布答案,但我不能,因为它仍然被搁置。谢谢你的澄清-我已经提名重新开放。