我正在尝试创建一个私人消息系统,这就是我想要做的事情。
如果ToId或fromid为42,则查询必须为与toid / 42关联的每个toid / fromid返回一行(最近一行)行。
在这种情况下,它应该是带有msg ids的行。 -3,4,6,7-
答案 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