Re: Sorting with materialized paths - Mailing list pgsql-general

From Peter Hunsberger
Subject Re: Sorting with materialized paths
Date
Msg-id AANLkTin-JU3Pxhd5QJzbssfo5dYcbS-0kwzyTjJOCsaR@mail.gmail.com
Whole thread Raw
In response to Sorting with materialized paths  (Ovid <curtis_ovid_poe@yahoo.com>)
List pgsql-general
On Sun, May 9, 2010 at 8:33 AM, Ovid <curtis_ovid_poe@yahoo.com> wrote:
> My apologies. This isn't PG-specific, but since this is running on PostgreSQL 8.4, maybe there are specific features
whichmight help. 
>
> I have a tree structure in a table and it uses materialized paths to allow me to find children quickly. However, I
alsoneed to sort the results depth-first, as one would expect with threaded forum replies. 
>
>  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
>
> So the final results should actually be sorted like this:
>
>  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
>
> Rationale:  this is for a threaded forum and id 6 is a reply to id 2, so it needs to show up after that one.  Here's
therough structure of what the output would look like (imagine an HTML forum): 
>
> * id 1 (root post)
>    * id 2
>        * id 6
>            * id 8
>    * id 3
>    * id 4
>    * id 5
>        * id 9
>    * id 7
>
> How would I work that out? Can I do that in straight SQL or should additional information be added to this table?
>

This is (once more) a flat query if you use a set / subset tree
implementation.  Joe Celko's book "Trees and Hierarchies in SQL for
Smarties" might be the fastest way to get up to speed on this, but you
can also figure it out if you spend a bit of time with Google....
Basically, every node in the tree is a table row with two columns, say
left and right. All children are contained within the left and right
of the parent.  Pre-order tree traversal gives the algorithm for
assigning left and right.  Once done, your problem is solved by
ordering on left.



--
Peter Hunsberger

pgsql-general by date:

Previous
From: Alvaro Herrera
Date:
Subject: Re: PostgreSQL 9.0 - support for RANGE value PRECEDING window functions
Next
From: Greg Stark
Date:
Subject: Re: Sorting with materialized paths