9

スレッド化された掲示板用の DB スキーマを作成している画像。特定のスレッドに対して適切にソートされたリストを選択する効率的な方法はありますか? 私が書いたコードは動作しますが、私が望むようにはソートされません。

次のデータがあるとします。

ID | 親ID
-----------------
1 | ヌル
2 | 1
3 | 2
4 | 1
5 | 3

したがって、構造は次のようになります。

1
|- 2
| | |- 3
| | | | |- 5
|- 4

理想的には、コードでは、結果セットが次の順序で表示されるようにします: 1, 2, 3, 5, 4
問題:私が書いた CTE では、実際には1, 2, 4, 3, 5として返されます。

これは LINQ を使用して簡単にグループ化/順序付けできることはわかっていますが、これをメモリ内で行うのは気が進まないのです。現時点ではそれが最善の解決策のように思えますが...

現在使用しているCTEは次のとおりです。

with Replies as (   
    select c.CommentID, c.ParentCommentID 1 as Level
        from Comment c
        where ParentCommentID is null and CommentID = @ParentCommentID

    union all

    select c.CommentID, c.ParentCommentID, r.Level + 1 as Level
       from Comment c
       inner join Replies r on c.ParentCommentID = r.CommentID
)

select * from Replies

助けていただければ幸いです。ありがとう!



私は SQL が初めてで、hierarchyid データ型について聞いたことがありません。このコメントからそれについて読んだ後、これを自分のデザインに取り入れたいと思うかもしれません. 今夜これを試して、成功した場合はさらに情報を投稿します.



dance2die の提案を使用して、サンプル データから返された結果を更新します。

ID | 親 ID | レベル | 密なランク
--------------------------------------
15 ヌル 1 1
20 15 2 1
21 20 3 1
17 22 3 1
22 15 2 2
31 15 2 3
32 15 2 4
33 15 2 5
34 15 2 6
35 15 2 7
36 15 2 8
4

4 に答える 4

8

きっと気に入っていただけると思います。最近、 MSDNによると、「結果セットのパーティション内でのランキング」のためのDense_Rank()関数について知りました。

以下のコードと、「CommentID」がどのようにソートされるかを確認してください。

私の知る限り、結果セットを ParentCommentID で分割しようとしています。

「denserank」列に注意してください。

with Replies (CommentID, ParentCommentID, Level) as 
(
        select  c.CommentID, c.ParentCommentID, 1 as Level
        from    Comment c
        where   ParentCommentID is null and CommentID = 1

        union all

        select  c.CommentID, c.ParentCommentID, r.Level + 1 as Level
        from    Comment c
                inner join Replies r on c.ParentCommentID = r.CommentID
)
select  *,
        denserank = dense_rank() over (partition by ParentCommentID order by CommentID)
from    Replies
order by denserank

代替テキスト

以下の結果

于 2009-02-20T04:07:25.793 に答える
1

hierarchyid (sql2008 のみ) または一連の文字列 (またはバイト) 連結を使用する必要があります。

于 2009-07-06T21:31:33.863 に答える
0

うーん、あなたの構造がこの問題に最適かどうかはわかりません。頭のてっぺんから、上記のクエリ内で必要に応じてデータをソートすることはとにかく考えられません。

私が考えることができる最善の方法は、コメントを結び付ける親テーブル (トピック テーブルなど) がある場合です。そうすれば、返信をそれに簡単に結合できるはずです(明らかに正しい列を含める必要があります)。次に、トピックID、レベルで並べ替えて、目的の並べ替え順序を取得できます(またはその他の情報トピック テーブルは、並べ替えに適した値を表します)。

于 2009-02-19T16:46:22.933 に答える
0

階層全体 (変更された場合に更新するトリガーを含む) をフィールドに格納することを検討してください。

あなたの例のこのフィールドは次のようになります: 1 1.2 1.2.3 1.2.5 1.4

次に、そのフィールドでソートする必要があります。これを試して、次を確認してください。

create table #temp (test varchar (10))
insert into #temp (test)
select '1'
union select '1.2'
union select '1.2.3'
union select '1.2.5'
union select '1.4'
select * from #temp order by test asc
于 2009-02-19T18:08:03.747 に答える