1

我正在尝试创建一个私人消息系统,这就是我想要做的..

在此处输入图像描述

如果 ToId 或 fromid 为 42,则查询必须为与 toid/from 42 关联的每个 toid/fromid 返回一个(最近的行)行。

在这种情况下,它应该是带有 msg id 的行.. 3,4,6,7

4

2 回答 2

3

这是一个应用程序row_number()

select msgid, fromid, toid, msg, date
from (select t.*,
             ROW_NUMBER() over (partition by fromid, toid
                                order by msgid desc
                               ) as seqnum
      from t
      where 42 in (fromid, toid)
     ) t
where seqnum = 1;

这用于msgid确定最近的值。只需将订单更改order by date desc为使用日期即可。

如果您想要最新的唯一对(无论顺序如何),则需要更多逻辑:

但是,您需要将消息以“规范”格式放置,因此 (42, 43) 与 (43, 42) 相同。关键是按较小的值和较大的值进行分区,按以下顺序:

select msgid, fromid, toid, msg, date
from (select t.*,
             ROW_NUMBER() over (partition by (case when fromid < toid then fromid else toid end),
                                             (case when fromid < toid then toid else fromid end)
                                order by msgid desc
                               ) as seqnum
      from t
      where 42 in (fromid, toid)
     ) t
where seqnum = 1;
于 2013-05-30T13:50:51.653 回答
0

这将从您的表中选择前 1 条消息 id(MsgId):

   select MAX(MsgId) messageID
   from table 
   group by FromId, ToId
   order by messageID
于 2013-05-30T14:11:51.523 回答