MySql - Select annidata
Per visualizzare una struttura ad albero, con padri e figli annidati, su piu' livelli.
Del tipo
38
15
10
5
2
3
17
9
8
6
26
13
1
12
18
11
7
I dati sono in una tabella GRUPPI, di MySQL, i cui campi sono
CODI_GRUPPO
DESC_GRUPPO
CODI_PADRE
Un gruppo puo' essere o meno padre e a sua volta figlio.
Un padre puo' avere piu' di un figlio o non averne.
Un figlio puo' avere solo 1 padre.
Se il db fosse stato Oracle, abbiamo a disposizione queste funzioni e questa soluzione http://www.adp-gmbh.ch/ora/sql/connect_by.html
ma in sql queste non esistono e quindi ho creato questa select, leggermente complicata dall'aggiunta di una tabella di relazione per
estrarre il padre principale.
SELECT g1.cod_grupo AS lev1,
g1.nombre_grupo AS lev1_name,
g2.cod_grupo as lev2,
g2.nombre_grupo AS lev2_name,
g3.cod_grupo as lev3,
g3.nombre_grupo AS lev3_name,
g4.cod_grupo as lev4,
g4.nombre_grupo AS lev4_name,
g5.cod_grupo as lev5,
g5.nombre_grupo AS lev5_name
FROM dp_grupos AS g1
LEFT JOIN dp_grupos AS g2 ON g2.cod_grupo_padre = g1.cod_grupo AND g2.activo='$iFlagActivo'
LEFT JOIN dp_grupos AS g3 ON g3.cod_grupo_padre = g2.cod_grupo AND g3.activo='$iFlagActivo'
LEFT JOIN dp_grupos AS g4 ON g4.cod_grupo_padre = g3.cod_grupo AND g4.activo='$iFlagActivo'
LEFT JOIN dp_grupos AS g5 ON g5.cod_grupo_padre = g4.cod_grupo AND g5.activo='$iFlagActivo'
WHERE g1.cod_grupo = (select cod_grupo
FROM dp_grupos_usuarios
WHERE cod_usuario='$id'
and defecto=1)
Questa select mi restituisce n-record, dove i campi sono i livelli eventualmente popolati e come
potete notare la profondita' massima e' fissata a 5
Quindi gli elementi risultanti dell'array sono di questo tipo,
ListaArray
(
[0] => Array
(
[lev1] => 5534
[lev1_name] => GRUPO PADRE
[lev2] => 5535
[lev2_name] => SEGRETARIA GENERALE
[lev3] => 5536
[lev3_name] => GABINETTO DEL
[lev4] => 5541
[lev4_name] => UNITA 3
[lev5] =>
[lev5_name] =>
)
[1] => Array
(
[lev1] => 5534
[lev1_name] => GRUPO PADRE
[lev2] => 5535
[lev2_name] => SECRETARIA GENERAL DE
[lev3] => 5538
[lev3_name] => UNITA 2
[lev4] => 5593
[lev4_name] => PRIMO OSPEDALE
[lev5] =>
[lev5_name] =>
)
[2] => Array
(
[lev1] => 5534
[lev1_name] => GRUPO PADRE
[lev2] => 5535
[lev2_name] => SECRETARIA GENERAL DE
[lev3] => 5538
[lev3_name] => UNIDAD 2
[lev4] => 5594
[lev4_name] => SECONDO OSPEDALE
[lev5] =>
[lev5_name] =>
)
[3] => Array
(
[lev1] => 5534
[lev1_name] => GRUPO PADRE
[lev2] => 5596
[lev2_name] => SEGRETERIA 2
[lev3] =>
[lev3_name] =>
[lev4] =>
[lev4_name] =>
[lev5] =>
[lev5_name] =>
)
etcc....
Ci sara' sicuramente un modo migliore per estrarre i dati ma questa per il momento e' l'unica soluzione che ho trovato.







Linkedin
Flickr
Anobii
Youtube
Lastfm