1

我有下表。

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。

4

1 回答 1

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

于 2013-08-23T09:26:56.650 回答