我正在创建一个简单的聊天模块,其中有两个级别。
我想列出我和其他用户之间的对话,并显示该特定用户的最新聊天消息。
消息(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的最新消息。
如何进行查询,我只能获取特定用户的最新行?
答案 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