如何 SELECT 一次只有最近的(和多个)值?
How to SELECT only the most recent (and multiple) values once?
我正在尝试查找用户 ID 1
与之进行过对话的人(例如,交换的消息)。我只需要每个其他用户的 ID 一次,但我想获得按日期(或最高 ID,因为 ID 是增量键)排序的结果 ID,其中每个用户与用户的最新对话(消息) 1
发生了。用户 1
可能是发送消息的人或接收消息的人,任何情况都算作 'conversation' 或与其他用户的互动。
这是我正在做的事情
SELECT fromId AS userId FROM messaging
WHERE toId = 1
UNION
SELECT toId AS userId FROM messaging
WHERE fromId = 1
当然,这只是 return 每个用户的 ID,但它不会 return 按消息发生的顺序生成结果。例如,如果用户与用户 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;
这里有一个例子 fiddle 供您参考: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;
该查询的一般要点与之前的查询相同 - 构建一个派生的 table,它只有用户 ID、消息日期,这次还有消息。在用户 ID 上左连接派生 table 到自身(因此重复联合查询),而且消息时间更长。因为我们离开加入,如果没有消息具有相同的用户 ID,但时间戳更大,我们将在结果的后半部分留下空值。这表明我们有最近的消息时间以及文本。剩下要做的就是根据这些空值进行过滤,然后排序。
我正在尝试查找用户 ID 1
与之进行过对话的人(例如,交换的消息)。我只需要每个其他用户的 ID 一次,但我想获得按日期(或最高 ID,因为 ID 是增量键)排序的结果 ID,其中每个用户与用户的最新对话(消息) 1
发生了。用户 1
可能是发送消息的人或接收消息的人,任何情况都算作 'conversation' 或与其他用户的互动。
这是我正在做的事情
SELECT fromId AS userId FROM messaging
WHERE toId = 1
UNION
SELECT toId AS userId FROM messaging
WHERE fromId = 1
当然,这只是 return 每个用户的 ID,但它不会 return 按消息发生的顺序生成结果。例如,如果用户与用户 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;
这里有一个例子 fiddle 供您参考: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;
该查询的一般要点与之前的查询相同 - 构建一个派生的 table,它只有用户 ID、消息日期,这次还有消息。在用户 ID 上左连接派生 table 到自身(因此重复联合查询),而且消息时间更长。因为我们离开加入,如果没有消息具有相同的用户 ID,但时间戳更大,我们将在结果的后半部分留下空值。这表明我们有最近的消息时间以及文本。剩下要做的就是根据这些空值进行过滤,然后排序。