2012-12-18 54 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

有人評論過這個不可見的東西。 這是個好建議。我設法拉最大評論日期的消息,然後在該日期前訂購。