您好我有一个表名messages
我想从两个用户之间的聊天对话中获取最后一条消息。
表 -
id from_id to_id text created
========================================
1 1 2 hi 2014-12-01 10:30:10
2 2 1 Hello 2014-12-01 10:30:20
3 3 1 Hi chinu 2014-12-01 10:32:02
4 3 1 hw r u? 2014-12-01 10:32:22
5 2 1 h r u? 2014-12-01 10:33:01
请检查我的查询=
//$user_id=$this->Session->read('Auth.User.id');
$user_id=1;
$fields=array('DISTINCT(Message.from_id), Message.id, Message.text, Message.created');
$this->Paginator->settings = array(
'conditions'=>array('Message.to_id'=>$user_id),
'limit' => 30,
'order' => array(
'Message.created' => 'DESC',
'Message.id' => 'DESC'
),
'fields'=>$fields,
'group'=>array('Message.from_id')
);
$inbox = $this->Paginator->paginate('Message');
pr($inbox);
$this->set('inbox', $inbox);
我希望获得2到3个id之间的最后一条消息对话。输出看起来像 -
id from_id to_id text created
========================================
5 2 1 h r u? 2014-12-01 10:33:01
4 3 1 hw r u? 2014-12-01 10:32:22
请帮帮我。如果您不了解cakephp,请在此处发布核心php MySQL查询。
由于 chatfun
答案 0 :(得分:0)
我认为这个查询可行(虽然我不明白为什么' to_id' = 1在你的预期输出中,也许我没有达到你的目的)
SELECT 'id', 'from_id', 'to_id', 'text', 'created'
FROM Message
WHERE ('from_id' = 2 AND 'to_id' = 3) OR ('from_id' = 3 AND 'to_id' = 2)
ORDER BY created DESC
LIMIT 1
答案 1 :(得分:0)
查询如何实现您正在查看的内容,即从每个from_id
获取最后一个对话
select t1.* from Message
t1 left join Message t2
on t1.from_id = t2.from_id
and t1.id<t2.id where t2.id is null;
您有一个主键id
auto_incremented,因此可以在比较中使用它而不是日期。
或者
select t1.* from Message t1
where not exists (
select 1 from Message t2 where t1.from_id = t2.from_id and t1.id < t2.id
);
答案 2 :(得分:0)
请检查此查询 -
SELECT * FROM (SELECT DISTINCT * FROM messages WHERE (from_id=1 OR to_id=1) ORDER BY created DESC) as m GROUP BY `from_id`