solo - traer registros repetidos sql
Seleccionar filas de la tabla usando la orden de árbol (4)
Tengo una tabla que contiene campos: id, parent_id, name (etc.)
Quiero pedir esta tabla en "orden de viaje en árbol", es decir.
id parent_id
1, 0
3, 1
5, 1
2, 0
8, 2
4, 0
9, 4
(...)
describir brevemente: tomar el nodo raíz, agregar todos los elementos secundarios, tomar el siguiente nodo raíz, anexar elementos secundarios, etc.
Según su descripción, supongo que se refiere al orden de amplitud, que podría hacerse fácilmente utilizando una consulta 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;
También puede usar el orden de primer orden usando el 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;
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 quiera decir GROUP los artículos, creo que sí, use
SELECT * FROM table ORDER BY id GROUP BY parent_id
Y también te aconsejo que leas este artículo: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
También puede usar el excelente módulo LTree , pero necesita reorganizar sus datos un poco.
Como lo notó sinérgico , la solución para el orden de profundidad proporcionada por Diogo Biazus no funcionará para identificadores con diferentes números de dígitos.
Pero puedes usar esta solución, que usa matrices de números enteros:
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;