你已经相当接近了,只需要在联合中添加一个额外的字段作为日期,然后按 id 分组,并按最大时间排序。像这样:
select id, max(message_time)
from
(select fromid id, message_time
from messaging
where toid = 1
union
select toid id, message_time
from messaging
where fromid = 1
) q
group by id
order by max(message_time) desc;
这里有一个小提琴示例:http://sqlfiddle.com/#!9/d248e/2
根据评论请求进行编辑
此查询将获取每个对话的最新消息以及消息文本。
select t1.id, t1.message_time, t1.message
from
(select fromid id, message_time, message
from messaging
where toid = 1
union
select toid id, message_time, message
from messaging
where fromid = 1
) t1
left join
(select fromid id, message_time, message
from messaging
where toid = 1
union
select toid id, message_time, message
from messaging
where fromid = 1
) t2
on t1.id = t2.id and t1.message_time < t2.message_time
where t2.id is null
order by t1.message_time desc;
该查询的一般要点与前面的查询相同 - 构建一个派生表,其中只有用户 ID、消息日期,这次还有消息。在用户 ID 上将该派生表左连接到自身(因此重复联合查询),但在消息时间较长的地方也是如此。因为我们要加入,如果没有具有相同用户 ID 但时间戳更大的消息,我们会在结果的后半部分留下空值。这表明我们拥有最新的消息时间以及文本。剩下要做的就是根据这些空值进行过滤,然后进行排序。
updated fiddle