1

私はプライベートメッセージングシステムを作成しようとしています.これが私がやりたいことです..

ここに画像の説明を入力

ToId または fromid が 42 の場合、クエリは、toid/from 42 に関連付けられた toid/fromid ごとに 1 行 (最新の行) だけを返す必要があります。

この場合、メッセージ 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 に答える