如何 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,但时间戳更大,我们将在结果的后半部分留下空值。这表明我们有最近的消息时间以及文本。剩下要做的就是根据这些空值进行过滤,然后排序。

updated fiddle