消息列表:在cakephp和mysql上按order和group by查询排序

时间:2014-03-11 01:08:26

标签: mysql cakephp

我想更改我的留言列表页面/收件箱。目前它显示来自数据库的所有消息,如果有人向我发送了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

请帮帮我..谢谢。

2 个答案:

答案 0 :(得分:0)

这应该可以解决问题(确保你的模型设置正确):

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

那里不需要子查询,它没有做任何花哨的事情。 The manual will help you with queries like this

答案 1 :(得分:0)

我使用Model :: query()http://book.cakephp.org/2.0/en/models/retrieving-your-data.html#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')
    )
);