<div dir="ltr">ciao, <div><br></div><div>non so se può aiutarti ma con postgresql utilizzerei le recursive cte (non so però se mysql le ha):</div><div><br></div><div>scrivo direttamente il codice sql perché faccio prima che provare a spiegare<br><div><br></div><div><div>create table test</div><div>(</div><div><span class="" style="white-space:pre">  </span>id <span class="" style="white-space:pre">               </span>int not null primary key,</div><div><span class="" style="white-space:pre">  </span>parent_id <span class="" style="white-space:pre">        </span>int,</div><div><span class="" style="white-space:pre">       </span>descr<span class="" style="white-space:pre">             </span>varchar(128) not null default ''</div><div>);</div><div><br></div><div>insert into test (id, descr) select 1, 'root a';</div><div>insert into test (id, descr) select 2, 'root b';</div><div>insert into test (id, descr) select 3, 'root c';</div><div>insert into test (id, parent_id, descr) select 4, 1, 'lev 1 a1';</div><div>insert into test (id, parent_id, descr) select 5, 1, 'lev 1 a2';</div><div>insert into test (id, parent_id, descr) select 6, 1, 'lev 1 a3';</div><div>insert into test (id, parent_id, descr) select 7, 2, 'lev 1 b1';</div><div>insert into test (id, parent_id, descr) select 8, 2, 'lev 1 b2';</div><div>insert into test (id, parent_id, descr) select 9, 3, 'lev 1 c1';</div><div>insert into test (id, parent_id, descr) select 10, 3, 'lev 1 c2';</div><div>insert into test (id, parent_id, descr) select 11, 4, 'lev 2 a11';</div><div>insert into test (id, parent_id, descr) select 12, 11, 'lev 3 a111';</div><div>insert into test (id, parent_id, descr) select 13, 6, 'lev 2 a31';</div><div>insert into test (id, parent_id, descr) select 14, 6, 'lev 2 a32';</div><div>insert into test (id, parent_id, descr) select 15, 9, 'lev 2 c12';</div><div>insert into test (id, parent_id, descr) select 16, 14, 'lev 3 a31';</div><div>insert into test (id, parent_id, descr) select 17, 16, 'lev 4 a311';</div></div><div><br></div><div><div>with recursive t(root_id, level, id, parent_id, descr) as</div><div>(</div><div>  select id as root_id, 0 as level, id, parent_id, descr from test where parent_id is null</div><div><br></div><div>  union all</div><div><br></div><div>  select t.root_id, t.level + 1 as level, <a href="http://test.id">test.id</a>, test.parent_id, test.descr from t, test where test.parent_id = <a href="http://t.id">t.id</a></div><div>)</div><div>select * </div><div>from t</div><div>where root_id = 1</div><div><span class="" style="white-space:pre">        </span>and level <= 2;      -- prendo tutti i 'figli' dell'id 1 fino al livello 2</div></div></div><div><br></div><div>spero ti possa servire</div><div>ciao</div><div>riki</div><div><br></div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">Il giorno 3 marzo 2015 23:31, Francesco Angelo Brisa <span dir="ltr"><<a href="mailto:fbrisa@gmail.com" target="_blank">fbrisa@gmail.com</a>></span> ha scritto:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div><div><div><div><div>Effettivamente, se nemmeno chi ti ha proposto il lavoro ha le idee chiare allora, si generico !<br><br></div>Una sola tabella:<br></div>id, parent, livello, PR, altri campi.....<br><br></div>per semplificare le query consiglio di fare qualche vista o meglio ancora una tabelle che si aggiorna da triggers con l'lenco di tutti i figli, nipoti etc... di un nodo.<br><br><br></div><div>tabella:<br></div>parent, figlio<br><br></div>dove la coppia "parent + figlio" sono univoche<br><div><div><div><br></div><div>in questo modo con una semplice join hai tutti i figli di un padre.<br></div><div><br></div></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">Il giorno 3 marzo 2015 20:52, Mpuppeteer <span dir="ltr"><<a href="mailto:mpuppetier@gmail.com" target="_blank">mpuppetier@gmail.com</a>></span> ha scritto:<div><div class="h5"><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">Il giorno 3 marzo 2015 19:49, Diego Roversi <span dir="ltr"><<a href="mailto:diegor@tiscali.it" target="_blank">diegor@tiscali.it</a>></span> ha scritto:<div><div><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span>On Tue, 3 Mar 2015 16:26:50 +0100<br>
Mpuppeteer <<a href="mailto:mpuppetier@gmail.com" target="_blank">mpuppetier@gmail.com</a>> wrote:<br>
<br>
> Ciao ragazzi,<br>
> sono indeciso su come gestire un sistema piramidale a livello di database:<br>
><br>
> L'idea è la classica tabella<br>
> id e parent_id, ma mi sembra complicato da gestire.<br>
><br>
<br>
</span>Oh cielo, i sistemi piramidali.<br>
<br>
Ad ogni modo gestire un sistema gerarchico in generale in sql, e quasi impossibile (se si usano solo query). Se usi un id_parent, ti serve comunque del codice che cicla e lancia svariate query per trovare i nodi figli. Se cerchi di farlo con un unica query, non se po' fa' ...<br>
<br>
Nel tuo caso hai una semplificazione non da poco, che e' quella che ti interessano un numero limitato di sotto livelli. Quindi al limite puoi creare una tabella con:<br>
<br>
id, id_parent_1, id_parent_2, id_parent_3, in cui specifichi il nodo di chi e' figlio, nipote, pronipote etc etc...<br>
<span><font color="#888888"><br>
--<br>
Diego Roversi <<a href="mailto:diegor@tiscali.it" target="_blank">diegor@tiscali.it</a>><br>
</font></span><div><div><br>
--<br>
Mailing list info: <a href="http://lists.linux.it/listinfo/gl-como" target="_blank">http://lists.linux.it/listinfo/gl-como</a><br>
</div></div></blockquote></div></div></div><br></div><div class="gmail_extra">Grazie Diego, infatti stavo rivedendo la cosa soprattutto per l'inserimento dei figli dei figli ecc...</div><div class="gmail_extra">con una funzione ricorsiva funziona, ma le query diventano parecchie.</div><div class="gmail_extra">La tua idea mi piace, sperimento e ti faccio sapere!</div><div class="gmail_extra"><br></div><div class="gmail_extra">Il problema vero e proprio è che nemmeno chi mi ha proposto il lavoro ha un'idea precisa su cosa vuole fare.. tanto per cambiare.<br></div><div class="gmail_extra"><br></div></div>
<br><br>
--<br>
Mailing list info: <a href="http://lists.linux.it/listinfo/gl-como" target="_blank">http://lists.linux.it/listinfo/gl-como</a><br>
<br></blockquote></div></div></div><br></div>
<br><br>
--<br>
Mailing list info: <a href="http://lists.linux.it/listinfo/gl-como" target="_blank">http://lists.linux.it/listinfo/gl-como</a><br>
<br></blockquote></div><br></div>