2

我有两张桌子Post (id, ..., creationdate)Post_Has_Post(parent_id, child_id).

一些帖子可以是父<->子关系的一部分,并且在Post_Has_Post-Table 中有相应的条目。

我要做的是获取按创建日期排序的帖子列表。但是,其他帖子的任何子级都应插入结果中其父级之后。现在当然很容易按创建日期排序,但我对第二个排序条件没有想法。有没有办法做到这一点?

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 即可。这将允许您将关系存储在一个表中。

根据 DBMS,您可以考虑使用:

甲骨文: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 不允许任何递归选择语句(如果我错了请纠正我,这样我就可以重做我写的一些代码!!)

于 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 回答