Sql 如何在cakephp中从数据库中查找不同的值

Sql 如何在cakephp中从数据库中查找不同的值,sql,cakephp,Sql,Cakephp,我正在实现一个类似Facebook的消息系统。在预览中,我想显示发件人发送给特定收件人的最后一封邮件。我现在遇到的问题是,我当前的代码从数据库中获取所有消息给收件人。 我现在的代码是 $messages = $this->Message->find('all', array( 'conditions' => array('recipient_id' => $recipient_id), 'order' => array('Message.id' =&

我正在实现一个类似Facebook的消息系统。在预览中,我想显示发件人发送给特定收件人的最后一封邮件。我现在遇到的问题是,我当前的代码从数据库中获取所有消息给收件人。 我现在的代码是

$messages = $this->Message->find('all',
  array(
   'conditions' => array('recipient_id' => $recipient_id),
   'order' => array('Message.id' => 'desc'),
   'fields' => array('DISTINCT Message.sender_id','Message.message')
  )
);
如果我像这样使用它,它确实有效

$messages = $this->Message->find('all',
  array(
   'conditions' => array('recipient_id' => $recipient_id),
   'order' => array('Message.id' => 'desc'),
   'fields' => array('DISTINCT Message.sender_id')
 )
);
但在这种情况下,我不会得到与唯一发件人关联的最后一条消息


我在谷歌上做了很多研究,没有发现任何有用的东西。有可能吗?一切帮助都将不胜感激。谢谢。

我建议尝试按条款分组:

$messages = $this->Message->find('all',
  array(
    'conditions' => array(
      'recipient_id' => $recipient_id,
    ),
    'order' => array(
      'Message.id' => 'DESC'
    ),
    'group' => array('Message.sender_id')
  )
);


GROUP BY将根据提供答案的发送者id对可能的结果进行分组。

这类问题经常被问到,MySQL(或其他一些数据库标签)是每组前N个问题的一部分

假设您的messages表中有这些字段

  • 身份证
  • 发送者身份证
  • 收件人id
  • 发送日期
  • 信息文本
对于收件人_id=1,将为每个发件人返回最后一封邮件的SQL为:

SELECT Message.*
FROM messages AS Message
JOIN (SELECT sender_id, MAX(sent_date) AS recent_date
      FROM messages
      WHERE recipient_id = 1
      GROUP BY sender_id) AS most_recent
  ON most_recent.sender_id = Message.sender_id
    AND most_recent.recent_date = Message.sent_date
WHERE Message.recipient_id = 1;

这不容易转化为CakePHP的
find
方法。改为使用。

添加第二个条件(发送方id)如何,而不是find('all'find('first'带有'order'=>数组('timestamp'=>'DESC'),