0

好的,我正在尽我所能把这个..

我有两个表message,并且comments关系正常,其中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

这适用于小桌子。它汇总了 Comments 表,查找每条消息的最新评论,然后按时间戳的降序对消息进行排序。如果表格很大,它会变得很慢,特别是如果您只显示前几条消息。在这种情况下,您希望对查询设置限制,以便扫描的完整表要少得多。例如,您可能会猜到您只需要最后一小时、一天或一周的行,而不是所有时间的行。

即使使用 OLAP 函数表示法,您仍然需要担心是否可以将查询限制为有用的数据子集。

于 2012-12-18T07:01:23.143 回答
1

有人对此发表了评论,这是不可见的。这是个好建议。我设法提取消息的最大评论日期,然后在该日期之前订购。

于 2012-12-18T06:54:04.673 回答
0

您可以使用 CTE(通用表表达式)和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 开始最近的评论。

从此 CTE(“临时”内嵌视图)中,您只需选择所有具有RowNum = 1最新评论日期的行。我也在选择CommentDateCTE 内部,因为我认为可能还没有评论,所以我使用该ISNULL()功能确保在没有评论存在的情况下提供虚构的评论日期。

于 2012-12-18T06:39:11.333 回答