2012-12-18 30 views
0

好吧,我试图把这个作为最好的,我可以..排序外键表

我有两个表messagecomments与正常的关系,其中messageIdcomments外键。

现在在特定的屏幕上,我显示当前按其发布日期排序的所有消息。以下是转折点:现在需要的是,虽然显示应该是相同的,只有消息应该被看到,但顺序应该根据发布在消息上的最新评论。

实施例:

  • 消息1个消息2
  • 消息1交日期>消息2交日期
  • 但消息2已经接收到评论刚才。

在这种情况下,消息2应该在列表的顶部,然后消息可以看出1

注:显示器,我不拉的意见,只表示踵消息订单

我希望我把那是正确的。

+0

“信息1发布日期>信息2发布日期”是否可以吗?因为消息2在消息1后发布,所以消息2发布日期大于消息1发布日期。 –

+0

你可以发布你的SQL查询来显示消息与coment .. –

回答

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 

在小桌子上合理地工作。它总结了评论表,找出每条消息的最新评论,然后按照时间戳的降序对消息进行排序。如果桌子很大,它会变得缓慢,特别是如果你只是要显示几个最重要的信息。在这种情况下,您希望对查询设置限制,以便比完整的表格少得多。例如,你可能猜测你只需要最后一小时,一天或一周的行,而不是所有的时间。

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

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。我还选择了CTE内部的CommentDate,由于我认为可能还没有评论,因此我使用ISNULL()函数确保在没有评论的情况下提供评论日期。

1

有人评论过这个不可见的东西。 这是个好建议。我设法拉最大评论日期的消息,然后在该日期前订购。