Problema sintassi INNER JOIN a 3 tabelle

Daniele Rapinesi

Utente Attivo
7 Gen 2014
60
0
0
Ciao a tutti,
ho 3 tabelle composte come segue:
1) tbl_commenti (idcommento, idutente, idpalestra, commento)
2) tbl_user (id_utente, nome)
3) tbl_risposta_commenti (id_commento, id_utente, risposta)

voglio visualizzare:
- l'idutente (non il numero ma il nome contenuto in tbl_user) ed il commento della 1a tabella;
- l'id_utente (non il numero ma il nome contenuto in tbl_user) e la risposta della 3a tabella;

con la query che vi riporto sotto, lui mi stampa tutto ciò che voglio tranne l'id_utente (nome) della risposta: se scivo id_tente mi stampa il numero, se scrivo nome mi mette quello della tabella 1. Supponiamo che il nome corrispondente ad idutente di tabella 1 sia Daniele e e quello di id_utente tabella 3 sia Marco, mi stampa correttamente Daniele con il commento, ma con la risposta mi stampa il numero dell'utente e non il nome Marco ... un aiutino ?????
Ecco il codice:

PHP:
<?php 
$query = "SELECT * FROM tbl_commenti WHERE idpalestra = $idpalestra";
$res = mysql_query($query);
$row = mysql_fetch_assoc ($res);

if (mysql_num_rows($res)>0)	
	{

	$query = "
	SELECT 
	tbl_commenti.idcommento, 
	tbl_commenti.idpalestra, 
	tbl_commenti.commento, 
	tbl_commenti.idutente, 
	tbl_commenti.data_inserimento, 
	tbl_user.id_utente, 
	tbl_user.nome, 
	tbl_risposta_commenti.idrisposta, 
	tbl_risposta_commenti.id_commento, 
	tbl_risposta_commenti.id_utente, 
	tbl_risposta_commenti.risposta, 
	tbl_risposta_commenti.data_inserimento_r 
	FROM 
	tbl_commenti
	
	JOIN 
	tbl_user 
	ON 
	tbl_commenti.idutente = tbl_user.id_utente 
	
	JOIN 
	tbl_risposta_commenti 
	ON 
	tbl_commenti.idcommento = tbl_risposta_commenti.id_commento 
	
	WHERE idpalestra = '$idpalestra' 
	ORDER BY idcommento";

	$res = mysql_query($query);
	$row = mysql_fetch_assoc($res);
	$act_idcommento = $row['idcommento'];
?>
        <tr><td>L'utente <?php echo $row['nome'] ?></td></tr>
        <tr><td>ha scritto: <?php echo $row['commento'] ?></td></tr>
        <tr><td>L'utente <?php echo $row['id_utente'] ?></td></tr>
        <tr><td>ha risposto: <?php echo $row['risposta'] ?></td></tr>
<?php
	while ($row = mysql_fetch_assoc($res)){
		if ($act_idcommento == $row['idcommento']){
?>
        <tr><td>L'utente <?php echo $row['id_utente'] ?></td></tr>
        <tr><td>ha risposto: <?php echo $row['risposta'] ?></td></tr>
<?php

		} else {
			$act_idcommento = $row['idcommento'];
?>
                <tr><td>L'utente <?php echo $row['nome'] ?></td></tr>
                <tr><td>ha scritto: <?php echo $row['commento'] ?></td></tr>
                <tr><td>L'utente <?php echo $row['id_utente'] ?></td></tr>
                <tr><td>ha risposto: <?php echo $row['risposta'] ?></td></tr>
<?php
		}
			
	}
}
else 	{
	echo "Non ci sono commenti per questa struttura";
}

?>
 
Ultima modifica di un moderatore:
ciao,
per ottenere il nome, dovresti fare una quarta join cercando di assegnare un alias alla tabella utenti,

ma, partendo dal presupposto che gli utenti delle tabelle commenti e risposte, ESISTONO sicuramente
nella tabella utenti, si può ... semplificare con una sola joint tra due select ...
la scrivo con qualche separazione ... per mia comprensione
Codice:
SELECT
  CO.idpalestra, 

  CO.idcommento,
  CO.commento, 
  CO.data_inserimento, 
  CO.idutente, 
  CO.nome,

  RI.idrisposta, 
  RI.risposta, 
  RI.data_inserimento_r,
  RI.id_utente, 
  RI.nome

FROM
(SELECT 
  tbl_commenti.idpalestra, 
  tbl_commenti.idcommento,
  tbl_commenti.commento, 
  tbl_commenti.data_inserimento, 
  tbl_commenti.idutente, 
  tbl_user.nome
FROM 
  tbl_commenti,
  tbl_user
WHERE tbl_commenti.idpalestra = '1'
AND   tbl_user.id_utente = tbl_commenti.idutente) CO

LEFT JOIN
(SELECT 
  tbl_risposta_commenti.id_commento, 
  tbl_risposta_commenti.idrisposta, 
  tbl_risposta_commenti.risposta, 
  tbl_risposta_commenti.data_inserimento_r,
  tbl_risposta_commenti.id_utente, 
  tbl_user.nome
FROM
  tbl_risposta_commenti,
  tbl_user
WHERE tbl_user.id_utente = tbl_risposta_commenti.id_utente) RI
ON CO.idcommento = RI.id_commento

ORDER BY CO.idcommento, RI.idrisposta
ovviamente al posto di 1 devi mettere l'id della palestra

il risultato è questo,
Codice:
1	1	commento1	2014-08-01 12:00:00.000	1	utente1	2	c1_risposta2	2014-08-01 12:00:00.000	11	utente11
1	2	commento2	2014-08-01 12:00:00.000	3	utente3	NULL	NULL	NULL	NULL	NULL
1	3	commento3	2014-08-01 12:00:00.000	6	utente6	5	c3_risposta5	2014-08-01 12:00:00.000	6	utente6
1	3	commento3	2014-08-01 12:00:00.000	6	utente6	12	c3_risposta12	2014-08-01 12:00:00.000	5	utente5
1	10	commento10	2014-08-01 12:00:00.000	1	utente1	NULL	NULL	NULL	NULL	NULL
le colonne sono in ordine come select principale

attento ai null quando non esistono risposte (li avresti anche con la tua soluzione)
ciao
Marino
 
Però non capisco cosa é CO.nome e RI.nome .... Il nome dell'utente sta solo nella tabella user ...

CO e RI sono le due "tabelle virtuali" create con le due select,
se noti,
la prima select contiene i commenti con il rispettivo user che l'ha generato
la seconda select invece contiene le risposte con, altrettanto, lo user che l'ha generato
la join unisce il risultato delle due tabelle che hanno assunto il nome CO e RI,
vedi l'alias dopo la parentesi di chiusura,
quindi pur mantenendo i nomi dei campi, questi sono associati all' alias della select/tabella
ciao
Marino
 

Discussioni simili