sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Ordenar árbol con un camino materializado?

Creo que tu camino materializado no es el correcto.

¿Qué lógica obtienes para ordenar cosas como esta?

1
1.2
1
1.5

¿Por qué el segundo 1 no está junto con el primero?

Si tuvieras

1
1.2
2
2.5

Esto sería trivial.

EDITAR:he visto su ejemplo y no está almacenando la ruta materializada de una fila, pero está almacenando una ruta materializada de la fila principal. Así es como debería verse realmente la ruta materializada de la fila. Ordenar directamente en matpath funcionaría si no tuviera más de 9 ramas si lo almacenara como:

 id | parent_id | matpath   |          created
----+-----------+-----------+----------------------------
  2 |         1 | 1.2       | 2010-05-08 15:18:37.987544
  6 |         2 | 1.2.6     | 2010-05-08 17:50:43.288759
  8 |         6 | 1.2.6.8   | 2010-05-09 14:01:17.632695
  3 |         1 | 1.3       | 2010-05-08 17:38:14.125377
  4 |         1 | 1.4       | 2010-05-08 17:38:57.26743
  5 |         1 | 1.5       | 2010-05-08 17:43:28.211708
  9 |         5 | 1.5.9     | 2010-05-09 14:02:43.818646
  7 |         1 | 1.7       | 2010-05-08 18:18:11.849735

de lo contrario (>9) tendrías que convertir el matpath en algo como

001.002.006
001.002.006.008

eso admitiría hasta 999 sucursales.

Tenga en cuenta

  • incluso el enfoque con 4 dígitos fijos, como 0001.0002.0006 le daría un campo que es más corto que en la respuesta aceptada
  • podría analizar matpath y producir un valor de clasificación sobre la marcha con una función de usuario
  • podría almacenar matpath directamente en este formato (también tiene algunas otras propiedades agradables)