PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Arbre de tri avec un chemin matérialisé ?

Je crois que votre chemin matérialisé n'est pas le bon.

Quelle logique obtenez-vous pour trier des choses comme ça

1
1.2
1
1.5

Pourquoi le deuxième 1 n'est-il pas avec le premier ?

Si vous aviez

1
1.2
2
2.5

Ce serait trivial.

EDIT:J'ai regardé votre exemple et vous ne stockez pas le chemin matérialisé d'une ligne, mais vous stockez un chemin matérialisé de la ligne parent.Voici à quoi devrait ressembler le chemin matérialisé de la ligne. Trier directement sur matpath fonctionnerait si vous n'aviez pas plus de 9 branches si vous l'aviez stocké sous :

 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

sinon (>9) il faudrait tourner le matpath dans quelque chose comme

001.002.006
001.002.006.008

qui prendrait en charge jusqu'à 999 succursales.

Veuillez noter

  • même l'approche avec 4 chiffres fixes, comme 0001.0002.0006 vous donnerait un champ plus court que dans la réponse acceptée
  • vous pouvez analyser matpath et produire une valeur de tri à la volée avec une fonction utilisateur
  • vous pouvez stocker directement matpath dans ce format (il a aussi d'autres propriétés intéressantes)