Retrieving full hierarchy sorted by a column under PostgreSQL's Ltree module

前端 未结 2 1490
日久生厌
日久生厌 2021-02-06 02:51

I\'m using PostgreSQL\'s Ltree module for storing hierarchical data. I\'m looking to retrieve the full hierarchy sorted by a particular column.

Consider the following ta

2条回答
  •  半阙折子戏
    2021-02-06 03:30

    create table comments (
      id serial,
      parent_id int,
      msg text,
      primary key (id)
    );
    
    insert into comments (id, parent_id, msg) values (1, null, 'msg 1');
    insert into comments (id, parent_id, msg) values (2, null, 'msg 2');
    insert into comments (id, parent_id, msg) values (3, 1, 'msg 1 / ans 1');
    insert into comments (id, parent_id, msg) values (4, null, 'msg 3');
    insert into comments (id, parent_id, msg) values (5, 2, 'msg 2 / ans 1');
    insert into comments (id, parent_id, msg) values (6, 2, 'msg 2 / ans 2');
    insert into comments (id, parent_id, msg) values (7, 2, 'msg 2 / ans 3');
    

    desc

    WITH RECURSIVE q AS
    (
      SELECT  id, msg, 1 as level, ARRAY[id] as path
      FROM  comments c
      WHERE parent_id is null
      UNION ALL
      SELECT  sub.id, sub.msg, level + 1, path || sub.id
      FROM  q
        JOIN  comments sub
          ON  sub.parent_id = q.id
    )
    SELECT  id, msg, level
    FROM    q
    order by path || array_fill(100500, ARRAY[8 - level]) desc;
    

    results in

    4,"msg 3",1
    2,"msg 2",1
    7,"msg 2 / ans 3",2
    6,"msg 2 / ans 2",2
    5,"msg 2 / ans 1",2
    1,"msg 1",1
    3,"msg 1 / ans 1",2
    

    asc

    WITH RECURSIVE q AS
    (
      SELECT  id, msg, 1 as level, ARRAY[id] as path
      FROM  comments c
      WHERE parent_id is null
      UNION ALL
      SELECT  sub.id, sub.msg, level + 1, path || sub.id
      FROM  q
        JOIN  comments sub
          ON  sub.parent_id = q.id
    )
    SELECT  id, msg, level
    FROM    q
    --order by path || array_fill(100500, ARRAY[8 - level]) desc;
    order by path;
    

    results in

    1,"msg 1",1
    3,"msg 1 / ans 1",2
    2,"msg 2",1
    5,"msg 2 / ans 1",2
    6,"msg 2 / ans 2",2
    7,"msg 2 / ans 3",2
    4,"msg 3",1
    

提交回复
热议问题