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

时间:2015-02-13 14:34:38

标签: sql cakephp

我正在实施像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')
 )
);

但在这种情况下,我没有获得与唯一发件人关联的最后一条消息。

我在Google上进行了很多研究,但没有找到任何有用的东西。它甚至可能吗?所有帮助将不胜感激。感谢。

2 个答案:

答案 0 :(得分:0)

我建议尝试GROUP BY子句:

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

MySQL Docs on GROUP BY CakePHP Book on Find Options

GROUP BY会根据提供答案的sender_id对可能的结果进行分组。

答案 1 :(得分:0)

这种类型的问题经常在SO上被问及MySQL(或其他一些数据库标签),这是每组前N 问题的一部分。

假设您的消息表包含这些字段

  • ID
  • SENDER_ID
  • recipient_id
  • sent_date
  • MESSAGE_TEXT

将为recipient_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方法。请改用query method