我之前曾经问过类似的问题,但是没有一个问题具有相同的条件,他们的答案对于这种情况不起作用.
包含消息的表如下所示:
id | owner_id | recipient_id | content | created 1 | 1 | 2 | Hello | 2015-12-08 20:00 2 | 2 | 1 | Hey | 2015-12-08 20:10 3 | 3 | 1 | You there? | 2015-12-08 21:00 4 | 1 | 3 | Yes | 2015-12-08 21:15 5 | 4 | 1 | Hey buddy | 2015-12-08 22:00
让我们说我查询用户ID 1的对话,预期结果是:
id | owner_id | recipient_id | content | created 5 | 4 | 1 | Hey buddy | 2015-12-08 22:00 4 | 1 | 3 | Yes | 2015-12-08 21:15 2 | 2 | 1 | Hey | 2015-12-08 20:10
我尝试了许多组合,使用JOIN和子查询,但没有一个给出预期的结果.
我正在寻找MySQL的答案,但这将用于CakePHP 2下开发的项目,所以如果有一个特定于Cake的方法,那就太好了.
这是我尝试过的一个查询,但它不起作用.我相信甚至不能满足我的需求.
SELECT IF ( owner_id = 1, recipient_id, owner_id ) AS Recipient, ( SELECT content FROM messages WHERE ( owner_id = 1 AND recipient_id = Recipient ) OR ( owner_id = Recipient AND recipient_id = 1 ) ORDER BY created DESC LIMIT 1 ) FROM messages WHERE owner_id = 1 OR recipient_id = 1 GROUP BY Recipient;
splash58.. 6
select t.* from t join (select user, max(created) m from ( (select id, recipient_id user, created from t where owner_id=1 ) union (select id, owner_id user, created from t where recipient_id=1) ) t1 group by user) t2 on ((owner_id=1 and recipient_id=user) or (owner_id=user and recipient_id=1)) and (created = m) order by created desc
在sqlfiddle上的例子
select t.* from t join (select user, max(created) m from ( (select id, recipient_id user, created from t where owner_id=1 ) union (select id, owner_id user, created from t where recipient_id=1) ) t1 group by user) t2 on ((owner_id=1 and recipient_id=user) or (owner_id=user and recipient_id=1)) and (created = m) order by created desc
在sqlfiddle上的例子