Tengo una estructura de árbol en una tabla y usa rutas materializadas para permitirme encontrar niños rápidamente. Sin embargo, también tengo que ordenar los resultados primero, como se esperaría con las respuestas del foro enhebrado.Clasificación de árbol con una ruta materializada?
id | parent_id | matpath | created
----+-----------+---------+----------------------------
2 | 1 | 1 | 2010-05-08 15:18:37.987544
3 | 1 | 1 | 2010-05-08 17:38:14.125377
4 | 1 | 1 | 2010-05-08 17:38:57.26743
5 | 1 | 1 | 2010-05-08 17:43:28.211708
7 | 1 | 1 | 2010-05-08 18:18:11.849735
6 | 2 | 1.2 | 2010-05-08 17:50:43.288759
9 | 5 | 1.5 | 2010-05-09 14:02:43.818646
8 | 6 | 1.2.6 | 2010-05-09 14:01:17.632695
Así que los resultados finales en realidad debería ser ordenados así:
id | parent_id | matpath | created
----+-----------+---------+----------------------------
2 | 1 | 1 | 2010-05-08 15:18:37.987544
6 | 2 | 1.2 | 2010-05-08 17:50:43.288759
8 | 6 | 1.2.6 | 2010-05-09 14:01:17.632695
3 | 1 | 1 | 2010-05-08 17:38:14.125377
4 | 1 | 1 | 2010-05-08 17:38:57.26743
5 | 1 | 1 | 2010-05-08 17:43:28.211708
9 | 5 | 1.5 | 2010-05-09 14:02:43.818646
7 | 1 | 1 | 2010-05-08 18:18:11.849735
¿Cómo voy a trabajar en eso? ¿Puedo hacer eso en SQL directo (esto es PostgreSQL 8.4) o debería agregarse información adicional a esta tabla?
Actualización: tratando de explicar mejor los criterios de clasificación.
Imagine que id '1' es la publicación raíz de un foro y todo lo que tiene un 'matpath' que comienza con '1' es hijo de esa publicación. Entonces los ids 2 a 5 son respuestas directas a 1 y obtienen los matpaths de '1'. Sin embargo, id 6 es una respuesta 2, no directamente a 1, por lo que obtiene un matpath de 1.2. Esto significa que para un foro roscado con anidamiento adecuado, con todos los identificadores que se muestran en las tablas, la estructura del foro se vería así, por lo tanto, el requisito de pedido:
* id 1 (root post)
* id 2
* id 6
* id 8
* id 3
* id 4
* id 5
* id 9
* id 7
Expandí la publicación raíz para explicar el requisito de clasificación. Perdón por la confusion. – Ovid
@Ovid: Ok, tiene sentido. Explicaré cómo hacerlo. – RedFilter
Acabo de agregar eso. Funciona de maravilla. Gracias. – Ovid