PDA

View Full Version : [Sql] struttura ad albero


gabmac2
13-02-2010, 21:48
Sto cercando di fare questa cosa,devo creare una struttura che ha come profondità al massimo 3,dove ognuna deve tenere riferimento al padre
es
id padre nome
1 0 root
2 1 mp3
3 1 foto
4 3 mare
però avendo profondità 3 come faccio a far "stampare" alla query
es

root/foto/mare

come si può sostituire a ID padre il nome corrispondente?

Grazie in anticipo

cionci
14-02-2010, 11:17
In teoria potresti fare un right outer join tre volte con la stessa tabella.
http://it.wikipedia.org/wiki/Join_(SQL)#Right_outer_joins

Così ti basta risalire dall'ultimo campo fino a quando trovi un NULL per ricostruire tutto il percorso.

gabmac2
14-02-2010, 20:32
intanto grazie mille cionci,sei stato veramente gentile

select c1.nome as Nome1,c2.nome as Nome2,c3.nome as Nome3
from cartelle c1 RIGHT OUTER JOIN cartelle c2
on c1.id=c2.padreid
RIGHT OUTER JOIN cartelle c3
on c2.id=c3.padreid


il terzo join che mi consigliavi non mi permette di farlo,perchè non lo prende
Dimentico qualcosa?
Inoltre le cartelle che hanno solo profondità 1, lasciano inevitabilmente vuoto il primo campo
C' è la possibilità di evitare?

Ultima cosa,c' è la possibilità di mettere nel codice immediatamente al fondo del nome della directory "/" senza doverlo fare manualmente
es.
scrivendo mp3 da solo diventi mp3/

Grazie ancora in anticipo

cionci
15-02-2010, 00:32
Strano, ti dovrebbe permettere di fare anche il terzo JOIN. Quale DBMS usi ?
Riguardo al campo vuoto è voluto...non tutte le categorie hanno la stessa profondità.
Sicuramente puoi anche ottenere il percorso completo separato da "/". Devi manipolare un po' di stringhe e controllare i campi NULL con qualche condizione. Però sono tutte cose che dipendono dal DBMS usato.
Basterebbe usare quella query (con i 3 JOIN però) come relazione dalla quale vai a riprendere i dati in FROM e poi lavorare sulle stirnghe.

gabmac2
15-02-2010, 09:56
postgresql,i primi due sono corretti?Come metto il terzo?

Come faccio a manipolare le stringhe?

Grazie ancora!

cionci
15-02-2010, 10:39
Non conosco il dialetto di postegresql, mi spiace.
Mi stampi il risultato di quella query ?

gabmac2
15-02-2010, 19:48
es root/mp3/canzoni inserendo come padre di canzoni mp3 e come padre mp3 root

cionci
15-02-2010, 20:07
Mi fai vedere il risultato riempiendo la tabella con qualche elemento ? Mi sa che ne bastano due di join.

gabmac2
15-02-2010, 21:07
ad esempio
root mp3
root foto mare
root foto montagna

cionci
15-02-2010, 21:13
Ma questo è il risultato della query ??? Dovrebbe farti vedere anche i campi NULL e i campi id.

gabmac2
15-02-2010, 23:05
select c1.nome as Nome1,c2.nome as Nome2,c3.nome as Nome3
come nome campi (Nome1,Nome2,Nome3)
e sotto i valori ad esempio come ti ho scritto
e ad esempio se root disegni
fa
null root disegni

cionci
16-02-2010, 09:31
Metti un numero di dati maggiore nella tabella. Almeno come nell'esempio del primo post.
Non mi puoi incollare tutto l'output ?
Comunque ti basta conoscere gli operatori condizionali (devi testare se è NULL un campo) e fra stringhe per concatenare i risultati.

gabmac2
16-02-2010, 09:50
mi puoi scrivere in codice questi 2 passaggi?

cionci
16-02-2010, 09:59
mi puoi scrivere in codice questi 2 passaggi?
Come ti ho detto non conosco il dialetto. Piuttosto che impararmelo io non sarebbe meglio che te lo imparassi tu ?
http://www.postgresql.org/docs/8.4/interactive/functions-conditional.html
http://www.postgresql.org/docs/8.4/interactive/functions-string.html