2

postgres のクエリで group by を使用しようとしています。必要に応じて結果をグループ化するために、思い通りに機能させることができません。

これは、先ほど回答した再帰クエリに関する別のスタックに関する質問の拡張です。しかし、最終的なクエリの root_id 列で結果をグループ化できるようにする必要があります。前のクエリは次のとおりです。

select cl.parent_comment_id, 
     cl.article_comment_id,
     cl.comment, 
     cl.article_id,
     cl.comment_depth
from comment_list cl
order by cl.root_id, cl.article_comment_id, cl.comment_depth;

同じparent_comment_idを持つすべてのレコードが一緒に保持されるように、私がやりたいことは次のとおりです。

select cl.parent_comment_id, 
     cl.article_comment_id,
     cl.comment, 
     cl.article_id,
     cl.comment_depth
from comment_list cl
group by cl.parent_comment_id
order by cl.parent_comment_id, cl.article_comment_id, cl.comment_depth;

同じparent_comment_idが返されたレコードが多数存在する可能性がありますが、任意のarticle_comment_idに対して異なるレコードが返されます。つまり、各コメントは一意 (ID、コメント、タイトルなど) ですが、各親コメントは多くの子を持つことができます。これは再帰クエリによって既に取得されているため、正しくグループ化しようとしています。

編集:


http://www.sqlfiddle.com/#!12/77771/2を見てください。id=3 が親であるため、article_comment_id=6 が article_comment_id=3 のすぐ下に続くようにします。次に article_comment_id=4。

ただし、これは手続き的に行う必要があると考えています。

したがって、誰かが方法を知らない限り、これは「気にしない」タイプの質問だと思います(それが私がそれを残している理由です)。しかし、私はこの部分を手続き的に解決しようとしていると思います。

4

1 に答える 1

4

再帰クエリの場合、0 で埋められた文字列でこのトリックを使用して階層パスを作成できます: SQL Fiddle

with recursive comment_list(article_comment_id, parent_comment_id, comment, article_id, comment_depth, comment_path) AS (
    select c.article_comment_id, 
           c.parent_comment_id, 
           c.comment, 
           c.article_id, 
           c.comment_depth,
           substr(CAST(1000000000+c.article_comment_id as varchar(1000)),2)
    from test_comment c
    where article_id = 100
      and parent_comment_id = 0

  union all

    select c.article_comment_id, 
           c.parent_comment_id, 
           c.comment, 
           c.article_id, 
           c.comment_depth,
           cl.comment_path || substr(CAST(1000000000+c.article_comment_id as varchar(1000)),2)
    from test_comment c
       join comment_list cl on c.parent_comment_id = cl.article_comment_id
)
select cl.article_comment_id,
     cl.comment_path, 
     cl.parent_comment_id,
     cl.comment, 
     cl.article_id,
     cl.comment_depth
from comment_list cl
order by cl.comment_path, cl.article_comment_id, cl.comment_depth;

GROUP BY を削除します。それらを「グループ化」して表示したいのですが、これは実際には「ORDER BY」です

select cl.parent_comment_id, 
     cl.article_comment_id,
     cl.comment, 
     cl.article_id,
     cl.comment_depth
from comment_list cl
order by cl.parent_comment_id, cl.article_comment_id, cl.comment_depth;

cl.root_id順序で が必要な場合とそうでない場合があるため、

order by cl.root_id, cl.parent_comment_id, cl.article_comment_id, cl.comment_depth;
于 2012-11-09T20:27:34.513 に答える