-
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 ?>
?>
-
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.