2011-11-14 63 views
0

我正在開發一個Facebook類型的應用程序,我正在嘗試開發一個很好的查詢來獲取最新的消息。消息可以是新線程(parentID空guid)或回覆。什麼是我需要的是一個查詢來獲得第10位,或10​​-20,或20-30線程或者是最新的或有latsest答覆,我希望你的想法SQL幫助,heirarchical表數據

這是表

CREATE TABLE [dbo].[Messages](
[Id] [uniqueidentifier] NOT NULL, 
[ParentId] [uniqueidentifier] NOT NULL, 
[message] [nvarchar](max) NOT NULL, 
[MessageDateTime] [datetime] NOT NULL 
) 

我有一個查詢,這種作品,因爲它可以得到前10名,20名3o結果等。

SELECT ym.* FROM 
(
    SELECT top 20 TopId, MAX(MessageDateTime) as Mess FROM 
    (

     SELECT 
     CASE ParentId WHEN '00000000-0000-0000-0000-000000000000' THEN Id ELSE ParentId END AS TopId, MessageDateTime 
     FROM Messages 

) As Temp 
    GROUP BY TopId order by Mess desc) 
    AS table2 
    INNER JOIN Messages ym 
    ON ym.id = TopId 

主要問題是可能沒有回覆,因此情況statemnt。 提前感謝您提供的任何幫助。

+0

如果在沒有父項時允許ParentId爲NULL,這將有所幫助。然後你可以使用合併而不是案例。數據描述時依然咀嚼答案。 –

+0

看起來這隻會返回沒有孩子的父消息和/或消息。這是在一個單獨的查詢處理,或者這也應該返回兒童? –

回答

1

正如我上面所說,如果ParentId在沒有父對象時被允許爲NULL,這將有所幫助。然後你可以使用合併而不是案例。

這是接近你的以上。像上面那樣,它只會返回頂級消息(父母或沒有子女的消息),因爲此查詢也是基於Id。

SELECT * 
FROM Messages 
WHERE Id IN 
(SELECT TOP 20 
CASE ParentId WHEN '00000000-0000-0000-0000-000000000000' THEN Id ELSE ParentId END AS TopId 
FROM Messages ORDER BY MessageDateTime DESC) 

如果允許空值,它可以被清理這樣的:

SELECT * 
FROM Messages 
WHERE Id IN 
(SELECT TOP 20 
coalesce(ParentId, Id) AS TopId 
FROM Messages ORDER BY MessageDateTime DESC) 

而且那麼這將是微不足道的調整查詢到包括原始消息和回覆:

SELECT * 
FROM Messages 
WHERE coalesce(ParentId, Id) IN 
(SELECT TOP 20 
coalesce(ParentId, Id) AS TopId 
FROM Messages ORDER BY MessageDateTime DESC) 

希望這會有所幫助。如果不是,請解釋我缺少的東西。

+0

感謝您的回答Tevo,改變ParentID以接受NULLS確實沒有問題,它確實簡化了事情,簡單的總是更好的IMO。 –