SQL Query从每个发件人中选择前1条消息

时间:2013-05-30 13:43:49

标签: sql sql-server

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

enter image description here

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

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

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

   select MAX(MsgId) messageID
   from table 
   group by FromId, ToId
   order by messageID