2

シンプルであるべきことをしようとしていますが、何かが欠けています。グループ化および順序付けされた階層データを返そうとしています。説明しようとするのではなく、写真を添付し​​ます...千の言葉の価値があると聞きました:

データベース内のデータの順序と結果セットが必要な順序。

主な選択基準は article_id であるため、ハードコードされた値は適切ではないことに注意してください。次に、記事の最初の「ルート レベル」 article_comment_id の行に沿って並べられ、その後にそのサブノードが続き、次に「ルート レベル」の article_comment_id が続きます。およびそのサブノード。

サンプルのテーブルとデータを提供しているので、私が何を意味するかを理解できるようになります。

CREATE TABLE test_comment
(
  article_comment_id bigserial NOT NULL,
  article_id bigint NOT NULL,
  parent_comment_id bigint,
  comment text NOT NULL,
  comment_depth integer,
  CONSTRAINT test_comment_pkey PRIMARY KEY (article_comment_id )
)

INSERT INTO test_comment (article_comment_id, article_id, parent_comment_id, comment, comment_depth)
VALUES
 (1, 100, 0, 'First Root Comment', 0)
,(5, 100, 0, 'Second Root Comment', 0)
,(2, 100, 1, 'Reply 1 to Root Comment', 1)
,(3, 100, 2, 'Reply 2 to Reply 1', 2)
,(4, 100, 3, 'Reply 3 to Reply 2', 3)
,(6, 100, 2, 'Reply 4 to Reply 1', 2)
,(7, 100, 5, 'Reply 5 to Second Root Comment', 1);

私はこれを試しましたが、適切な順序を提供しません:

with recursive comment_list(article_comment_id, parent_comment_id, comment, article_id) AS (
    select c.article_comment_id, c.parent_comment_id, c.comment, c.article_id
    from test_comment c
    where article_id = 100
  union
    select c.article_comment_id, c.parent_comment_id, c.comment, c.article_id
    from test_comment c, comment_list cl
    where c.article_comment_id = cl.article_comment_id
    )
    select * from comment_list;

とにかく、このPostgreSQL固有のクエリをJPAで使用できますか?

4

1 に答える 1

4

ルート アーティクル ID を各ノードに「運び」、その順序を取得できるように階層レベルを計算する必要があります。

with recursive comment_list(article_comment_id, parent_comment_id, comment, article_id, level, root_id) AS (
    select c.article_comment_id, 
           c.parent_comment_id, 
           c.comment, 
           c.article_id, 
           0 as level,
           article_comment_id as root_id 
    from test_comment c
    where article_id = 100
      and parent_comment_id = 0

  union

    select c.article_comment_id, 
           c.parent_comment_id, 
           c.comment, 
           c.article_id, 
           cl.level + 1,
           cl.article_comment_id 
    from test_comment c
       join comment_list cl on c.parent_comment_id = cl.article_comment_id
)
select article_comment_id, 
     parent_comment_id, 
     comment, 
     article_id
from comment_list
order by root_id, level;

SQLFiddle: http://www.sqlfiddle.com/#!12/af0d6/4

(ところで:ユニオンの再帰部分で結合が間違っています)

于 2012-11-08T22:41:25.970 に答える