[gl-como] Mysql gestione sistema piramidale

Riccardo Penco riccardo.penco@gmail.com
Mer 4 Mar 2015 09:14:24 CET


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
>
>
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.linux.it/pipermail/gl-como/attachments/20150304/0248b074/attachment.html>


Maggiori informazioni sulla lista gl-como