我正在尝试创建一个私人消息系统,这就是我想要做的..
如果 ToId 或 fromid 为 42,则查询必须为与 toid/from 42 关联的每个 toid/fromid 返回一个(最近的行)行。
在这种情况下,它应该是带有 msg id 的行.. 3,4,6,7
我正在尝试创建一个私人消息系统,这就是我想要做的..
如果 ToId 或 fromid 为 42,则查询必须为与 toid/from 42 关联的每个 toid/fromid 返回一个(最近的行)行。
在这种情况下,它应该是带有 msg id 的行.. 3,4,6,7
这是一个应用程序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 条消息 id(MsgId):
select MAX(MsgId) messageID
from table
group by FromId, ToId
order by messageID