Выберите строки из таблицы, используя порядок деревьев - PullRequest
7 голосов
/ 14 сентября 2010

У меня есть таблица, в которой есть поля: id, parent_id, name (и т. Д.)

Я хочу заказать эту таблицу в "порядке перемещения по дереву", т.е...)

вкратце: взять корневой узел, добавить все дочерние элементы, взять следующий корневой узел, добавить дочерние элементы и т. Д.

Ответы [ 4 ]

10 голосов
/ 14 сентября 2010

Под вашим описанием я предполагаю, что вы имеете в виду порядок в ширину, который можно легко выполнить с помощью запроса WITH RECURSIVE (PostgreSQL 8.4+):

WITH RECURSIVE tree 
AS 
(
    SELECT 
        node_name, id, parent_id, NULL::varchar AS parent_name 
    FROM foo 
    WHERE parent_id IS NULL 
    UNION
    SELECT 
        node_name, f1.id, f1.parent_id, tree.node_name AS parent_name 
    FROM 
        tree 
        JOIN foo f1 ON f1.parent_id = tree.id
) 
SELECT node_name, empno, parent_id, node_name FROM tree;

Вы также можете использовать порядок глубины, используя следующий SQL:

WITH RECURSIVE tree 
AS 
(
    SELECT 
        node_name, id, parent_id, NULL::varchar AS parent_name, id::text AS path 
    FROM foo WHERE parent_id IS NULL 
    UNION
    SELECT 
        node_name, f1.id, f1.parent_id, tree.node_name AS parent_name, tree.path || '-' || f1.id::text AS path 
    FROM 
        tree 
        JOIN foo f1 ON f1.parent_id = tree.id
) 
SELECT node_name, empno, parent_id, node_name, path FROM tree ORDER BY path;
4 голосов
/ 25 августа 2014

Как заметил synergetic , решение для первого порядка глубины, предоставленное Diogo Biazus , не будет работать для идентификаторов с различным количеством цифр.

Но вместо этого вы можете использовать это решение, которое использует массивы целых чисел:

WITH RECURSIVE tree 
AS 
(
    SELECT 
        node_name, id, parent_id, NULL::varchar AS parent_name, array[id] AS path 
    FROM foo WHERE parent_id IS NULL 
    UNION
    SELECT 
        node_name, f1.id, f1.parent_id, tree.node_name AS parent_name, tree.path || f1.id AS path 
    FROM 
        tree 
        JOIN foo f1 ON f1.parent_id = tree.id
) 
SELECT node_name, empno, parent_id, node_name, path FROM tree ORDER BY path;
0 голосов
/ 16 сентября 2010

Вы также можете использовать отличный модуль LTree , но вам нужно немного реорганизовать данные.

0 голосов
/ 14 сентября 2010
SELECT * FROM table ORDER BY id,parent_id

Это должно упорядочить мои столбцы в порядке, указанном в запросе.

Если вы не имеете в виду Сгруппировать предметы, я думаю, что вы это делаете, тогда используйте

SELECT * FROM table ORDER BY id GROUP BY parent_id

И я также советую вам прочитать эту статью: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...