MySQL查询只能拉取最新记录

时间:2011-12-03 06:00:42

标签: mysql sql cakephp cakephp-1.3 greatest-n-per-group

我正在创建一个简单的聊天模块,其中有两个级别。

  1. 收件箱
  2. 对话
  3. 收件箱中的

    我想列出我和其他用户之间的对话,并显示该特定用户的最新聊天消息。

    消息(id,user_id,receiver_id,message,timestamp)

    虚拟数据

    1, 1, 2, "hi there", today
    
    2, 1, 4, "Hey Tommy", yesterday
    
    3, 1, 2, "Wanna meet tonite?", now
    

    现在,当我显示列表时,我想只显示两条消息 一个用户ID为4,用户ID为2.但是只能显示用户ID 2的最新消息。

    如何进行查询,我只能获取特定用户的最新行?

4 个答案:

答案 0 :(得分:2)

SELECT *
FROM (SELECT *
FROM `messages`
WHERE `user_id` = 1
ORDER BY `timestamp` DESC) TT
GROUP BY TT.`receiver_id`;

希望以上有所帮助!

答案 1 :(得分:1)

我会这样试试:

$user_id = 2;

$latestmessage = $this->Message->find('first', array(
    'conditions' => array(
        'user_id' => $user_id
    ),
    'order' => 'id DESC'
));

答案 2 :(得分:1)

这可能有效:

$latest_per_user_id = $this->Message->find('all', array(
    'fields'=>'DISTINCT user_id',
    'order' => 'timestamp DESC'
));

编辑:如果您只需要一个用户的信息,您可以这样做:

$latest_msg_by_user = $this->Message->find('first', array(
        'conditions'=>array('user_id'=>$user_id),
        'order' => 'timestamp DESC'
    ));

你可以将它放在循环中以便为每个用户获取它。

答案 3 :(得分:1)

相信这是实现这一目标的有效方法:

SELECT M1.* FROM Messages M1 LEFT JOIN Messages M2 
ON M1.ReceiverID = M2.ReceiverID AND M1.Timestamp < M2.Timestamp
WHERE M2.ID IS NULL