[gl-como] Mysql gestione sistema piramidale

Mpuppeteer mpuppetier@gmail.com
Mer 4 Mar 2015 10:03:04 CET


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

Per le recursive cte che sappia io MySQL non le ha , ma si possono emulare
con le  generic stored procedure... Se ho capito bene.
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.linux.it/pipermail/gl-como/attachments/20150304/dda1bc23/attachment.html>


Maggiori informazioni sulla lista gl-como