我试图找到与用户ID1
进行过对话的人员(例如,交换的消息)。我只需要一次其他用户的ID,但是我想按日期(或最高ID,因为ID是增量键)排序结果ID,在该日期中每个用户与用户的最新对话(消息)1
发生了 用户1
可以是发送消息的人,也可以是接收消息的人,无论哪种情况都算作“对话”或与其他用户的交互。
这就是我在做什么
SELECT fromId AS userId FROM messaging
WHERE toId = 1
UNION
SELECT toId AS userId FROM messaging
WHERE fromId = 1
但是,当然,这仅返回每个用户的ID,但不会按消息发生的顺序返回结果。例如,如果用户与用户ID 5的对话,而该消息的ID高于他与用户6的对话,则顺序必须为5, 6
有什么办法可以只通过一个查询来做到这一点?
谢谢。
您的关系还算合理,只需要为日期添加一个额外的字段,然后按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左连接(从而重复并集查询),但消息时间也更长。因为我们保持联接状态,所以如果没有消息具有相同的用户名,但时间戳较大,则结果的后半部分将为空。这表示我们拥有最新的消息时间以及文本。然后剩下要做的就是根据这些空值进行过滤并排序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句