私はプライベートメッセージングシステムを作成しようとしています.これが私がやりたいことです..
ToId または fromid が 42 の場合、クエリは、toid/from 42 に関連付けられた toid/fromid ごとに 1 行 (最新の行) だけを返す必要があります。
この場合、メッセージ ID を持つ行である必要があります.. 3,4,6,7
私はプライベートメッセージングシステムを作成しようとしています.これが私がやりたいことです..
ToId または fromid が 42 の場合、クエリは、toid/from 42 に関連付けられた toid/fromid ごとに 1 行 (最新の行) だけを返す必要があります。
この場合、メッセージ 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;