2013-08-23 33 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

我用'陣列[排序] AS ordering'和'rc.ordering ||代替c.ordering'。 – rightfold

+0

是的,也可以這樣做,這只是解決方法,字符串可以在其他RDBMS中工作(如SQL Server,它沒有陣列) –