<p dir="ltr"><br>
Il 04/mar/2015 09:14 "Riccardo Penco" <<a href="mailto:riccardo.penco@gmail.com">riccardo.penco@gmail.com</a>> ha scritto:<br>
><br>
> ciao, <br>
><br>
> non so se può aiutarti ma con postgresql utilizzerei le recursive cte (non so però se mysql le ha):<br>
><br>
> scrivo direttamente il codice sql perché faccio prima che provare a spiegare<br>
><br>
> create table test<br>
> (<br>
> id int not null primary key,<br>
> parent_id int,<br>
> descr varchar(128) not null default ''<br>
> );<br>
><br>
> insert into test (id, descr) select 1, 'root a';<br>
> insert into test (id, descr) select 2, 'root b';<br>
> insert into test (id, descr) select 3, 'root c';<br>
> insert into test (id, parent_id, descr) select 4, 1, 'lev 1 a1';<br>
> insert into test (id, parent_id, descr) select 5, 1, 'lev 1 a2';<br>
> insert into test (id, parent_id, descr) select 6, 1, 'lev 1 a3';<br>
> insert into test (id, parent_id, descr) select 7, 2, 'lev 1 b1';<br>
> insert into test (id, parent_id, descr) select 8, 2, 'lev 1 b2';<br>
> insert into test (id, parent_id, descr) select 9, 3, 'lev 1 c1';<br>
> insert into test (id, parent_id, descr) select 10, 3, 'lev 1 c2';<br>
> insert into test (id, parent_id, descr) select 11, 4, 'lev 2 a11';<br>
> insert into test (id, parent_id, descr) select 12, 11, 'lev 3 a111';<br>
> insert into test (id, parent_id, descr) select 13, 6, 'lev 2 a31';<br>
> insert into test (id, parent_id, descr) select 14, 6, 'lev 2 a32';<br>
> insert into test (id, parent_id, descr) select 15, 9, 'lev 2 c12';<br>
> insert into test (id, parent_id, descr) select 16, 14, 'lev 3 a31';<br>
> insert into test (id, parent_id, descr) select 17, 16, 'lev 4 a311';<br>
><br>
> with recursive t(root_id, level, id, parent_id, descr) as<br>
> (<br>
> select id as root_id, 0 as level, id, parent_id, descr from test where parent_id is null<br>
><br>
> union all<br>
><br>
> 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><br>
> )<br>
> select * <br>
> from t<br>
> where root_id = 1<br>
> and level <= 2; -- prendo tutti i 'figli' dell'id 1 fino al livello 2<br>
><br>
> spero ti possa servire<br>
> ciao<br>
> riki<br>
><br>
><br>
><br>
> Il giorno 3 marzo 2015 23:31, Francesco Angelo Brisa <<a href="mailto:fbrisa@gmail.com">fbrisa@gmail.com</a>> ha scritto:<br>
><br>
>> Effettivamente, se nemmeno chi ti ha proposto il lavoro ha le idee chiare allora, si generico !<br>
>><br>
>> Una sola tabella:<br>
>> id, parent, livello, PR, altri campi.....<br>
>><br>
>> 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>
>> tabella:<br>
>> parent, figlio<br>
>><br>
>> dove la coppia "parent + figlio" sono univoche<br>
>><br>
>> in questo modo con una semplice join hai tutti i figli di un padre.<br>
>><br>
>><br>
>> Il giorno 3 marzo 2015 20:52, Mpuppeteer <<a href="mailto:mpuppetier@gmail.com">mpuppetier@gmail.com</a>> ha scritto:<br>
>><br>
>>><br>
>>> Il giorno 3 marzo 2015 19:49, Diego Roversi <<a href="mailto:diegor@tiscali.it">diegor@tiscali.it</a>> ha scritto:<br>
>>><br>
>>>> On Tue, 3 Mar 2015 16:26:50 +0100<br>
>>>> Mpuppeteer <<a href="mailto:mpuppetier@gmail.com">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>
>>>> 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>
>>>><br>
>>>> --<br>
>>>> Diego Roversi <<a href="mailto:diegor@tiscali.it">diegor@tiscali.it</a>><br>
>>>><br>
>>>> --<br>
>>>> Mailing list info: <a href="http://lists.linux.it/listinfo/gl-como">http://lists.linux.it/listinfo/gl-como</a><br>
>>><br>
>>><br>
>>> Grazie Diego, infatti stavo rivedendo la cosa soprattutto per l'inserimento dei figli dei figli ecc...<br>
>>> con una funzione ricorsiva funziona, ma le query diventano parecchie.<br>
>>> La tua idea mi piace, sperimento e ti faccio sapere!<br>
>>><br>
>>> 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>
>>><br>
>>><br>
>>><br>
>>> --<br>
>>> Mailing list info: <a href="http://lists.linux.it/listinfo/gl-como">http://lists.linux.it/listinfo/gl-como</a><br>
>>><br>
>><br>
>><br>
>><br>
>> --<br>
>> Mailing list info: <a href="http://lists.linux.it/listinfo/gl-como">http://lists.linux.it/listinfo/gl-como</a><br>
>><br>
><br>
><br>
><br>
> --<br>
> Mailing list info: <a href="http://lists.linux.it/listinfo/gl-como">http://lists.linux.it/listinfo/gl-como</a><br>
><br>
Grazie a tutti,<br>
sento il cliente gli chiedo esattamente cosa vuole, spiegandogli la situazione. </p>
<p dir="ltr">Per le recursive cte che sappia io MySQL non le ha , ma si possono emulare con le generic stored procedure... Se ho capito bene.<br>
</p>