我在表格中有一个树结构,它使用物化路径让我可以快速找到孩子。但是,我还需要对结果进行深度优先排序,正如人们对线程论坛回复所期望的那样。
id | parent_id | matpath | created
----+-----------+---------+----------------------------
2 | 1 | 1 | 2010-05-08 15:18:37.987544
3 | 1 | 1 | 2010-05-08 17:38:14.125377
4 | 1 | 1 | 2010-05-08 17:38:57.26743
5 | 1 | 1 | 2010-05-08 17:43:28.211708
7 | 1 | 1 | 2010-05-08 18:18:11.849735
6 | 2 | 1.2 | 2010-05-08 17:50:43.288759
9 | 5 | 1.5 | 2010-05-09 14:02:43.818646
8 | 6 | 1.2.6 | 2010-05-09 14:01:17.632695
所以最终的结果实际上应该是这样排序的:
id | parent_id | matpath | created
----+-----------+---------+----------------------------
2 | 1 | 1 | 2010-05-08 15:18:37.987544
6 | 2 | 1.2 | 2010-05-08 17:50:43.288759
8 | 6 | 1.2.6 | 2010-05-09 14:01:17.632695
3 | 1 | 1 | 2010-05-08 17:38:14.125377
4 | 1 | 1 | 2010-05-08 17:38:57.26743
5 | 1 | 1 | 2010-05-08 17:43:28.211708
9 | 5 | 1.5 | 2010-05-09 14:02:43.818646
7 | 1 | 1 | 2010-05-08 18:18:11.849735
我将如何解决这个问题?我可以直接使用 SQL(这是 PostgreSQL 8.4)来执行此操作,还是应该将其他信息添加到此表中?
更新:试图更好地解释排序标准。
想象一下 id '1' 是论坛的根帖子,所有以 '1' 开头的 'matpath' 都是该帖子的子项。所以 ids 2 到 5 是对 1 的直接回复并得到'1'的matpaths。但是,id 6 是回复 2,而不是直接回复 1,因此它的 matpath 为 1.2。这意味着对于具有正确嵌套的线程论坛,所有 id 都显示在表格中,论坛的结构将如下所示,因此排序要求:
* id 1 (root post)
* id 2
* id 6
* id 8
* id 3
* id 4
* id 5
* id 9
* id 7