2010-09-14 14 views
7

tengo bruja tabla contiene los campos: ID, parent_id, nombre (etc.)seleccionar las filas de la tabla utilizando fin árbol

quiero pedir este cuadro del "fin del viaje del árbol", es decir.

id parent_id 
1, 0 
3, 1 
5, 1 

2, 0 
8, 2 

4, 0 
9, 4 

(...)

en definitiva describen: tomar nodo raíz, anexar todos los niños, tomar a continuación nodo raíz anexar niños, etc.

Respuesta

10

Por su descripción supongo que te refieres lo ancho primer orden, que podría hacerse utilizando un fácilemte CON consulta recursiva (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; 

también es posible usar fin primero en profundidad utilizando la siguiente 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; 
+0

Thx para eso, no estaba al tanto de las consultas WITH existentes en Postgres – canni

+0

Creo que no podemos usar la instrucción UNION en la cláusula WITH – Fer

+1

Su solución para la orden de primer nivel no funcionará para los identificadores con diferentes números de dígitos. – synergetic

-2
SELECT * FROM table ORDER BY id,parent_id 

Eso debería ordenar mis columnas en el orden allí colocado dentro de la consulta.

A menos que media del grupo de los artículos, bruja Yo creo que sí, entonces utiliza

SELECT * FROM table ORDER BY id GROUP BY parent_id 

Y también recomendamos leer este artículo: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

+0

que no producirán resultados en orden yo quiero ... – canni

+0

Esto producirá error de sintaxis en Postgres (campo id debe ser utilizado en función agregada), esto no es MySQL :) – canni

+0

Ahh vale, lo siento, pensé que habría funcionado bajo 'postgres', no soy tan bueno con eso. – RobertPitt

0

También puede utilizar el excelente módulo LTree, pero hay que reorganizar los datos de un bit.

4

Como notado por sinérgico, la solución para el orden de profundidad primero proporcionada por Diogo Biazus no funcionará para de ID con diferente número de dígitos.

Pero puede utilizar esta solución en cambio, que utiliza matrices de número entero:

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; 
Cuestiones relacionadas