2013-08-23 2 views
1

У меня есть следующая таблица.Выбор дерева и упорядочение детей с помощью PostgreSQL

CREATE TABLE categories (
    id   integer serial primary key 
    parent_id integer 
    name  text not null 
    ordering integer not null 
); 

Я хочу выделить все категории, но отступы имеют названия дочерних категорий и помещают дочерние категории под родителями. На том же уровне их следует заказать по телефону ordering.

В настоящее время у меня есть следующий запрос, но возвращаемые дочерние категории находятся не в правильном порядке. Вместо этого они заказываются абсолютно, а не относительно их братьев и сестер.

WITH RECURSIVE recurse_categories(id, level, name, ordering) AS (
    SELECT id, 0 AS level, name, ordering 
     FROM categories 
    WHERE parent_id IS NULL 

    UNION ALL 

    SELECT c.id, level + 1, c.name, c.ordering 
     FROM categories AS c 
     JOIN recurse_categories rc 
     ON rc.id = c.parent_id 
) 

    SELECT id, repeat('→', level) || ' ' || name AS name 
    FROM recurse_categories 
ORDER BY ordering 

Как я могу сделать заказ правильно?

Я использую PostgreSQL 9.2.4.

ответ

1

аккумулируют заказа в строку:

WITH RECURSIVE recurse_categories(id, level, name, ordering) AS (
    SELECT id, 0 AS level, name, lpad(ordering::text, 10, '0') as ordering 
     FROM categories 
    WHERE parent_id IS NULL 

    UNION ALL 

    SELECT c.id, level + 1, c.name, rc.ordering || '→' || lpad(c.ordering::text, 10, '0') as ordering 
     FROM categories AS c 
     JOIN recurse_categories rc 
     ON rc.id = c.parent_id 
) 

    SELECT id, repeat('→', level) || ' ' || name AS name, ordering 
    FROM recurse_categories 
ORDER BY ordering 

sql fiddle demo

+0

Я использовал 'массив [упорядочение], как ordering' и' rc.ordering || вместо этого. – rightfold

+0

Да, это тоже можно сделать, это просто решение со строкой будет работать в других СУБД (например, SQL Server, у которых нет массивов) –

Смежные вопросы