2

私は2つのテーブルPost (id, ..., creationdate)Post_Has_Post(parent_id, child_id).

一部の投稿は、親 <-> 子関係の一部であり、Post_Has_Post-Table に対応するエントリを持つことができます。

私がやろうとしているのは、作成日順に並べられた投稿のリストを取得することです。ただし、他の投稿の子は結果の親の後に挿入する必要があります。もちろん今は作成日順で並べるのは簡単ですが、2番目の並べ替え条件が思い浮かびません。それを行う方法はありますか?

Post                              Post_Has_Post
+------+-------+--------------+   +-----------+----------+
| id   | ...   | creationdate |   | parent_id | child_id |
+------+-------+--------------+   +-----------+----------+
| 1    | ...   | 2010-11-01   |   |  1        |  3       |
| 2    | ...   | 2010-11-02   |   +-----------+----------+
| 3    | ...   | 2010-11-03   |
+------+-------+--------------+

次のようにソートされた結果が必要です。

Post
+------+-------+--------------+   
| id   | ...   | creationdate |  
+------+-------+--------------+  
| 1    | ...   | 2010-11-01   |  
| 3    | ...   | 2010-11-03   | 
| 2    | ...   | 2010-11-02   |
+------+-------+--------------+

これを並べ替えで解決する方法はありますか?

4

3 に答える 3

4

親が常に子の前に来ると仮定すると、これは機能するはずです。

SELECT p.id, ..., creationdate
    FROM Post p
        LEFT JOIN Post_Has_Post php
            ON p.id = php.child_id
    ORDER BY COALESCE(php.parent_id, p.id),
             creationdate
于 2011-06-29T15:14:05.673 に答える
2

テーブルPost_Has_Parentは必要ありません。代わりに、「parent_id」のPostテーブルに列を追加し、post_idとparent_idの関係と自己結合を使用することを検討してください。誰かが投稿に返信を投稿するときは、親の投稿IDを新しい投稿のparent_idとして入力するだけです。これにより、関係を1つのテーブルに格納できます。

DBMSに応じて、以下の使用を検討できます。

Oracle:Connect_be

select seq_num, post_text, parent_id, SYS_CONNECT_BY_PATH(seq_num,
'/') AS PATH, level
 from post
start with seq_num = 1
CONNECT BY NOCYCLE PRIOR seq_num = parent_id;

SQL Server:一般的なテーブル式

;with posts as
(

      select seq_num, post_text, parent_id, 0 AS generation,
              CAST(seq_num as varchar(50)) as path
              from recurs_test
              where parent_id is NULL
      UNION ALL
      select e.seq_num, e.post_text, e.parent_id, generation + 1,
              CAST(rtrim(p.path) + '/' +  CAST(e.seq_num as varchar(5)) as
varchar(50)) as path
              from recurs_test e
              inner join posts p
              on e.parent_id = p.seq_num

)

select seq_num, name, parent_id, dir, generation from
managers order by dir;

MYSQL:ある種のツリートラバーサルアルゴリズムを使用して調査し、深さ優先探索を実行する必要があります。それらはすべてかなり複雑で、通常、データベースに何か(パス、左右の値など)を格納する必要があります。その理由は、MYSQLでは再帰的なselectステートメントが許可されていないためです(間違っている場合は修正して、作成したコードをやり直すことができます!!)

于 2011-06-29T15:15:03.467 に答える
1

単一の列に日付が表示されることはありませんが、とにかく少し混乱します。データを表示している UI で、子スレッドの日付または親スレッドの日付を表示することを選択できます。

SELECT Parent.ID, Parent.CreationDate ParentCreationDate,
       Child.CreationDate ChildCreationDate
FROM Post Parent LEFT OUTER JOIN
     Post_Has_Post PHP ON Parent.ID = PHP.Parent_ID LEFT OUTER JOIN
     Post Child ON PHP.Child_ID = Child.ID
ORDER BY Parent.CreationDate, Child.CreationDate;
于 2011-06-29T15:18:06.710 に答える