0

わかりました、私はできる限りこれを入れようとしています..

私は 2 つのテーブルmessagecomments持っており、通常の関係でmessageId外部キーがcomments.

現在、特定の画面で、現在投稿日順に並べられたすべてのメッセージを表示しています。ここにひねりがあります。ここで必要なのは、メッセージのみが表示される場所での表示は同じである必要がありますが、順序はメッセージに投稿された最新のコメントに従う必要があるということです。

例:

  • メッセージ 1 とメッセージ 2
  • メッセージ 1 の投稿日 > メッセージ 2 の投稿日
  • しかし、message2 はたった今コメントを受け取りました。

その場合、メッセージ 2 がリストの一番上に表示され、次にメッセージ 1 が表示されます。

注:ディスプレイでは、コメントを取得せず、メッセージを投稿日順に表示するだけです

私はそれが正しいことを願っています。

4

3 に答える 3

2
SELECT M.*, C.MostRecent
  FROM Message M
  JOIN (SELECT MessageID, MAX(Comment_DateTime) AS MostRecent
          FROM Comments
         GROUP BY MessageID
       ) AS C ON M.MessageID = C.MessageID
 ORDER BY C.MostRecent DESC

それは小さなテーブルで合理的に機能します。コメント テーブルを要約し、各メッセージの最新のコメントを見つけて、タイムスタンプの降順でメッセージを並べ替えます。テーブルが大きい場合、特に上位のいくつかのメッセージのみを表示する場合は遅くなります。その場合、クエリに制限を設けて、テーブル全体がスキャンされるよりもはるかに少ない数をスキャンする必要があります。たとえば、すべての時間ではなく、過去 1 時間、1 日、または 1 週間の行のみが必要であると推測できます。

OLAP 関数の表記法を使用しても、クエリをデータの有用なサブセットに制限できるかどうかを心配する必要があります。

于 2012-12-18T07:01:23.143 に答える
1

誰かがこれについてコメントしましたが、これは表示されていません。良い提案でした。メッセージの最大コメント日付を取得し、その日付で注文することができました。

于 2012-12-18T06:54:04.673 に答える
0

CTE (Common Table Expression) とROW_NUMBER()関数を使用して、次のようなことを試すことができます。

;WITH CTE AS
(
 SELECT
     m.MessageId, m.MessageText, m.PostedDate,
     CommentDate = ISNULL(c.CommentDate, '19000101'),
     RowNum = ROW_NUMBER() OVER (PARTITION BY m.MessageID 
                                 ORDER BY ISNULL(c.CommentDate, '19000101') DESC) 
 FROM dbo.Messages m
 LEFT OUTER JOIN dbo.Comments c ON c.MessageId = m.MessageId
)
SELECT
   MessageId, MessageText, PostedDate
FROM 
   CTE
WHERE
   RowNum = 1
ORDER BY
   CommentDate DESC

この CTE は、データを で「分割」し、MessageIDすべてのコメント (存在する場合) によって番号を付けますCommentDate。したがって、それぞれについてMessageID、連続しRowNumた値を取得する必要があります。最新のコメントの 1 から開始します。

RowNum = 1この CTE (「一時的な」インライン ビュー) から、最新のコメント日付を持つすべての行を選択するだけです。私もCommentDateCTE内を選択していますが、まだコメントがないかもしれないと思っているので、コメントがないISNULL()場合は架空のコメント日付を確実に提供する機能を使用しています。

于 2012-12-18T06:39:11.333 に答える