2011-11-14 9 views
0

私はFacebookのアプリケーションを開発しています。最新のメッセージを得るために良いクエリを開発しようとしています。メッセージは、新しいスレッド(親IDの空のGUID)または応答にすることができます。最新またはlatsestの返信を持っているのどちらかである最初の10、または10〜20、または20〜30のスレッドを取得するためのクエリは何A私は必要ですが、私は願ってあなたのアイデアSQLのヘルプ、階層テーブルのデータ

を得るこれは、テーブル

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

私はトップ10と20の結果を得ることができるので、作品の種類のクエリを持っています。

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) 

あなたはNULLSを許可された場合、それはこのようにクリーンアップすることができます

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を受け入れるように変更することは本当に問題ありません。確かに物事をシンプルにします。 –