Visualizzazione risultati 1 fino 2 di 2

Discussione: Join in 3 tabelle

  1. #1
    coserandomiche non è connesso Neofita
    Data registrazione
    12-11-2020
    Messaggi
    3

    Predefinito Join in 3 tabelle

    Ciao ragazzi,
    mi sto dilettando nello studio del PHP e ammetto di avere un serio problema con la funziona JOIN quando si tratta di 3 tabelle.

    Allo stato attuale:

    gruppo
    id_gruppo || nome_gruppo

    1 -------------------- Gruppo 1
    2 --------------------Gruppo 2
    3 --------------------Gruppo 3

    carica
    id_carica || id_gruppo || nome_carica

    1 ---------------------1 -----------Ruolo_gruppo1_1
    2 ---------------------1 ----------Ruolo_gruppo1_2
    3 --------------------2 ----------Ruolo_gruppo2_1
    4 --------------------3 ----------Ruolo_gruppo3_1
    5 --------------------3 ----------Ruolo_gruppo3_2
    6 -------------------- 3 ----------Ruolo_gruppo3_3

    membri
    nome_membro || id_carica

    Tizio -------------------------- 4
    Caio -------------------------- 6
    Sempronio ----------------1


    Il mio problema sorge quando provo a creare una pagina con una tabella, divisa su due colonne, a sinistra il nome dei membri appartenenti allo stesso gruppo (ordinati per id_carica) e a destra un select con tutte le cariche di quel gruppo (ovviamente dentro un ciclo while).

    So fare un JOIN a 2, ma non a 3:

    SELEZIONO SOLO LE CARICHE STESSO GRUPPO:

    Codice PHP:
    $cariche = "SELECT carica.*, gruppo.*
    FROM carica JOIN gruppo ON carica.id_gruppo = gruppo.id_gruppo
    WHERE carica.id_gruppo IN
    (SELECT carica.id_gruppo
    FROM membri JOIN carica ON membri.id_carica = carica.id_carica
    WHERE membri.nome_membro=
    $login AND carica.id_gruppo>0)";
    SELEZIONO SOLO LE PERSONE STESSO GRUPPO:

    Codice PHP:
    $membri = "SELECT membri.*, carica.*
    FROM membri JOIN carica ON membri.id_carica=carica.id_carica
    WHERE carica.id_gruppo IN
    (SELECT carica.id_gruppo
    FROM membri JOIN carica ON membri.id_carica = carica.id_carica
    WHERE membri.nome_membro=
    $login AND carica.id_gruppo>0)";
    A questo punto nasce l'inghippo.

    Riesco a far comparire a sinistra i membri, ma nella colonna di destra, quando devo avviare il comando select con all'interno solo le cariche relative a quel gruppo, mi perdo.

    ESEMPIO (GRUPPO 3)

    Tizio | Ruolo_gruppo3_1, Ruolo_gruppo3_2, Ruolo_gruppo3_3
    Caio | Ruolo_gruppo3_1, Ruolo_gruppo3_2, Ruolo_gruppo3_3


    Posto quello che sono riuscito a fare:

    Codice PHP:
    <?php
    //richiamo i membri
    $membri = "SELECT membri.*, carica.*
    FROM membri JOIN carica ON membri.id_carica=carica.id_carica
    WHERE carica.id_gruppo IN
    (SELECT carica.id_gruppo
    FROM membri JOIN carica ON membri.id_carica = carica.id_carica
    WHERE membri.nome_membro=
    $login AND carica.id_gruppo>0)";
    $risultato_membri = ok_query($membri, 'result');

    while(
    $row = ok_query($risultato_membri, 'fetch')) {
    ?>
    <tr>
    <td>
    <u><?php echo $row['nome_membro']; ?></u>
    </td>
    <td>
    <select>
    <option>???????? cariche del gruppo</option>
    </select>
    </td>
    </tr>
    <?php }//fine while ?>
    ?>

  2. #2
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Assumendo che la query da te mostrata recuperi tutte le informazioni necessarie (cosa che ti invito a verificare), il problema mi sembra sia nel generare la tabella collocando le informazioni giuste al posto giusto.

    Potresti semplicemente leggere e ordinare tutta l'informazione prima di generare la tabella, utilizzando un dizionario indicizzato sugli id dei gruppi, ottenendo una struttura simile a:
    Codice:
    [
      1 => [
        'nome' => 'Gruppo 1',
        'cariche' => [
          ['id' => 3, 'nome' => 'Ruolo X'],
          ['id' => 7, 'nome' => 'Ruolo Y'],
        ],
        'membri' => [
          ['id' => 4', 'nome' => 'Alice'],
          ['id' => 7', 'nome' => 'Bob'],
          ['id' => 9', 'nome' => 'Carlo'],
        ]
      ],
      4 => [
        'nome' => 'Gruppo 4',
        ...
      ]
    ]
    Nella tabella potrai quindi mostrare un gruppo dopo l'altro e, per ciascuno, sapere quali sono i suoi membri e le sue cariche.
    Nota che così facendo perdi l'informazione di quale membro appartiene a quale gruppo: se ti serve puoi modificare la struttura del dizionario per aggiungerla.

    In alternativa potresti modificare la query ordinando per id del gruppo e id della carica, e generare la tabella senza passare per il dizionario intermedio: è più efficiente in termini di consumo di memoria, ma un po' più macchinoso da realizzare.

    I suggerimenti che do più spesso:


Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •