PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Ordinare l'albero con un percorso materializzato?

Credo che il tuo percorso materializzato non sia giusto.

Che logica hai per ordinare cose come questa

1
1.2
1
1.5

Perché il secondo 1 non è insieme al primo?

Se lo avessi

1
1.2
2
2.5

Sarebbe banale.

EDIT:ho esaminato il tuo esempio e non stai memorizzando il percorso materializzato di una riga, ma stai memorizzando un percorso materializzato della riga padre. Ecco come dovrebbe effettivamente apparire il percorso materializzato della riga. L'ordinamento direttamente su matpath funzionerebbe se non avessi più di 9 rami se lo avessi archiviato come:

 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

altrimenti (>9) dovresti girare il matpath in qualcosa come

001.002.006
001.002.006.008

che supporterebbe fino a 999 filiali.

Si prega di notare

  • anche l'approccio con 4 cifre fisse, come 0001.0002.0006 ti darebbe un campo più corto della risposta accettata
  • potresti analizzare al volo matpath un valore di ordinamento dei prodotti con una funzione utente
  • potresti memorizzare direttamente matpath in questo formato (ha anche altre proprietà interessanti)