0

私は、コメントとその返答を再帰的に整理する次のクエリを持っています。PostgreSQLで2つのソートオプションを持つ方法RECURSIVE

WITH RECURSIVE comment_tree AS (
    SELECT 
     id    AS comment_id, 
     body    AS comment_body, 
     reply_to   AS comment_reply_to, 
     1     AS level, 
     "createdAt"  AS comment_date, 
     commenter_id, 
     article_id, 
     array["createdAt"] AS path_info 
    FROM "Comments" 
    WHERE "reply_to" IS NULL 
    UNION ALL 
    SELECT 
     c.id, 
     c.body, 
     c.reply_to, 
     p.level + 1, 
     "createdAt", 
     c.commenter_id, 
     c.article_id, 
     p.path_info || c."createdAt" 
    FROM "Comments" c 
    JOIN comment_tree p ON c.reply_to = comment_id 
) 
SELECT 
    comment_id, 
    path_info, 
    comment_body, 
    comment_reply_to, 
    comment_date, 
    level, 
    U.first_name, 
    U.last_name, 
    coalesce(U.username, CAST(U.id AS VARCHAR)) AS username 
FROM comment_tree 
LEFT JOIN 
    "Users" U ON commenter_id = U.id 
     WHERE article_id = '62834723-B804-4CA1-B984-D949B1A7E1E2' 
ORDER BY path_info DESC; 

私が見ることができます...これは、ソート以外はこれまでのところうまくいきます。

現在、コメントは最も古いものから最新のものにソートされています。その下に正しく返信をネストしますが、私は親リストを最も古いものから最新のものにします。

子値DESCと親ASCを並べ替える方法はありますか?

例えば、

+----+----------+----------+ 
| id | reply_to | date | 
+----+----------+----------+ 
| C1 | null  | 01052016 | < - Oldest 
| C2 | null  | 02052016 | 
| C3 | C1  | 03052016 | 
| C4 | C1  | 04052016 | 
| C5 | null  | 05052016 | 
| C6 | C4  | 06052016 | 
| C7 | C2  | 07052016 | 
| C8 | C6  | 08052016 | < - Newest 
| |   |   | 
+----+----------+----------+ 

望ましい結果

| C5 (Newest Parent first) 
| C2 
    | C7 
| C1 
    | C3 (Oldest Child first for all tiers below parent) 
    | C4 
    | C6 
     | C8 
+0

:私はこのような何かを書きたい

 Table "laurenz.Comments" ┌───────────┬───────────────────────┬───────────┐ │ Column │ Type │ Modifiers │ ├───────────┼───────────────────────┼───────────┤ │ id │ character varying(10) │ not null │ │ reply_to │ character varying(10) │ │ │ createdAt │ date │ not null │ └───────────┴───────────────────────┴───────────┘ Indexes: "comment_tree_pkey" PRIMARY KEY, btree (id) Foreign-key constraints: "comment_tree_reply_to_fkey" FOREIGN KEY (reply_to) REFERENCES "Comments"(id) Referenced by: TABLE ""Comments"" CONSTRAINT "comment_tree_reply_to_fkey" FOREIGN KEY (reply_to) REFERENCES "Comments"(id) 

、id asc; ' – Abelisto

答えて

0

私は共通テーブル式人工コラムsortを紹介したいです。 Comments

次のように定義される:REPLY_TOは、その後のidエンドDESC nullのとき、場合によって `...順:ちょうどヒント

WITH RECURSIVE comment_tree AS (
    SELECT id, reply_to, "createdAt", 
      CAST(current_date - "createdAt" AS text) AS sort 
     FROM "Comments" 
     WHERE reply_to IS NULL 
    UNION ALL SELECT c.id, c.reply_to, c."createdAt", 
        substring(p.sort FROM '^[^-]*') || '-' || c."createdAt" 
     FROM "Comments" c 
      JOIN comment_tree p ON c.reply_to = p.id 
) 
SELECT id, reply_to, "createdAt" 
FROM comment_tree 
ORDER BY sort; 
+0

魅力的に働いた。私はタイムスタンプを使用しているので、CURRENT_DATEをCURRENT_TIMESTAMPに切り替えました。どうもありがとうございます! –

+0

これ以上の検査では、これは期待どおりに機能しません。トップレベルと最初の返信で動作しますが、後続の返信レベルは親注文を無視した日付順のリストに過ぎません。 –

+0

そうです、それは私があなたが望むと理解したものです。アイデアはおそらく同じですが、より複雑な場合は、希望の順序に対応する方法で行にタグを付けます。 –