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)