paolo@bimodesign.com | +34 608 61 64 10

DB Relational

        

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.