SQL INNER JOIN de três Campos

silvino

Power Member
Olá,

Tenho o seguinte problema, tenho 3 tabelas relacionadas entre elas por numero inteiro, sei que para obter os campos relacionados tenho de recorrer ao inner join. O Problema apareceu logo com a junção das duas primeiras, existem dois campos com a mesma designação. Acho que é melhor mostrar o código;

PHP:
$str="SELECT artigo.nome, subtopico.nome FROM artigo
        INNER JOIN subtopico ON artigo.iddep=subtopico.id";
Depois para visualizar;

PHP:
$res=mysql_query($str);
    
while($l=mysql_fetch_array($res)){
  echo '<p class="subtitulo">'.$l["nome"].'</p>'; //desejo obter o nome da tabela artigo
  echo '<p class="subtitulo">'.$l["nome"].'</p>'; //desejo obter o nome da tabela subtopico
}
Apenas obtenho o nome da primeira tabela, neste caso artigo...
 
Última edição:
Olá,

Já está resolvido ;) ,,,

PHP:
    while($l=mysql_fetch_array($res)){
            echo '<p class="subtitulo">'.$l[0].'</p>'; //devolve o campo da primeira tabela, neste caso artigo
            echo '<p class="subtitulo">'.$l[1].'</p>'; //devolve o campo da segunda tabela neste caso subtopico


How Are You? Optimos... Até Já ;) :lol:
 
quando fazes o select dos campos podes criar "alias" para os campos, para no caso de teres 2 campos com o mm nome não aparecer só o do 1º campo.

para criares esse alias fazes
Código:
Select artigo.nome alias, subtopico.titulo alias2 From ...
depois para chamares os resultados fazes
Código:
$l['alias'] para o artigo.nome e $l['alias2'] para o subtopico.titulo
O alias pode ser o que tu quiseres ...

Para o caso que tu apresentaste bastava que no código alterasses de

PHP:
$res=mysql_query($str);
    
while($l=mysql_fetch_array($res)){
  echo '<p class="subtitulo">'.$l["nome"].'</p>'; //desejo obter o nome da tabela artigo
  echo '<p class="subtitulo">'.$l["nome"].'</p>'; //desejo obter o nome da tabela subtopico
}
para

PHP:
$res=mysql_query($str);
    
while($l=mysql_fetch_array($res)){
  echo '<p class="subtitulo">'.$l["nome"].'</p>'; //desejo obter o nome da tabela artigo
  echo '<p class="subtitulo">'.$l["titulo"].'</p>'; //desejo obter o nome da tabela subtopico
}
Visto que os campos têm nomes diferentes "nome" e "titulo".

Não sei se fui explicito, mas a esta hora já tou senil :lol:
 
Grande Dica, Obrigado. Vou usar ;) ... Adoro programar a estas horas :D

Procurei na net sobre as alias, a "sintaxe correcta"

PHP:
$str="SELECT artigo.nome AS da, subtopico.nome AS ds FROM artigo 
        INNER JOIN subtopico ON artigo.iddep=subtopico.id";
Para terminar aqui fica o código completo para juntar três tabelas com o SQL,

PHP:
function artigosrecentes(){

$str="SELECT artigo.nome AS da, artigo.titulo AS ta, artigo.data AS data, artigo.descricao AS descricao,
        subtopico.nome AS ds, topico.nome AS dt FROM artigo 
        INNER JOIN subtopico ON artigo.iddep=subtopico.id
        INNER JOIN topico ON subtopico.iddep=topico.id
        ORDER BY artigo.data DESC LIMIT 10";
    
    echo '<div class="direito">'."\n";
    echo '<h3 class="titulo">Artigos recentes</h3>'."\n";
    echo '<hr>';
    $res=mysql_query($str);

    while($l=mysql_fetch_array($res)){
            echo '<h4 class="titulo">'.$l["ta"].'</h4>'."\n";
            echo '<p class="subtitulo">'.$l["data"].'</p>';
            echo '<p>'.$l["descricao"].'</p>'."\n";
            echo '<a href="'.$l["dt"].'/'.$l["ds"].'/'.$l["da"].'">Ler</a>';
            echo '<hr>'."\n";
    }
    echo '</div>'."\n";
}
 
Última edição pelo moderador:
sorry! foi da hora!

Sim tens de usar o "AS" antes ... para criar aliases para as tabelas é que não precisa!

por exemplo:

PHP:
$str="SELECT 
artigo.nome AS da,
artigo.titulo AS ta,
artigo.data AS data,
artigo.descricao AS descricao,
subtopico.nome AS ds,
topico.nome AS dt 

FROM artigo ar
INNER JOIN subtopico st ON ar.iddep=st.id
INNER JOIN topico to ON st.iddep=to.id
ORDER BY ar.data DESC LIMIT 10";

criei o alias "ar" para a tabela artigo,"st" para subtopico e "to" para topico, depois é só substituir na query! reduz bastante o numero de caracteres para querys grandes ;)
 
Aproveitando este tópico.
estou com um sistema de cadastro de itens, onde ja possuo mais de 1000 itens cadastrados, agora depois de tudo ok, preciso deixar que os usuarios cadastrados , cadastrem editem e deletem seus proprios itens , para isso criei uma tabela de usuario , só que não queria relacionar o mesmo a tabela de itens com uma nova coluna usuario_id na tab itens, devido o alto número de cadastros ja realizados, no entanto tenho uma coluna em comum nas duas tabelas " usuario e itens " , que seria a agencia. estou com problemas para visualizar conforme usuario logado.

A situação é a seguinte:
1 - Cadastro pelo cliente , fazer o cadastro somente da sua agencia = OK
2 - Editar o item cadastrado, editar somente da sua agencia = OK
3 - Deletar o item, deletar somente da sua agencia = OK
4 - Visualizar os itens de sua agencia = NOK

Código:
$link = mysql_connect($dbhost, $dbuser, $dbpass);
   $db = mysql_select_db($dbname); 
   $sql = "SELECT $dbvin.codigo AS codigo, $dbvin.cadastro AS cadastro, $dbvin.anomodelo AS anomodelo, $dbvin.marca AS marca, $dbvin.model AS model, $dbvin.condicao AS condicao, $dbvin.preco AS preco, $dbvin.agencia AS agencia, $dbusu.agencia AS agencia FROM $dbvin INNER JOIN $dbusu ON $dbvin.agencia=$dbusu.agencia";
   $exec = mysql_query($sql, $link) or die(mysql_error()); 
   $total = mysql_num_rows($exec); 
   
   $n = 1;
   while($data = mysql_fetch_array($exec, MYSQL_ASSOC )) {
      if(!($n % 2)) { $bg = "class='fill_light'"; } else { $bg = ''; }
      echo '<tr $bg>';
         echo '<td class="text">'.$data["cadastro"].'</td>';
         echo '<td class="text" align="center">'.$data["anomodelo"].'</td>';
         echo '<td class="text">'.$data["marca"].'</td>';
         echo '<td class="text">'.$data["model"].'</td>';
         echo '<td class="text" align="center">'.$data["condicao"].'</td>';
         echo '<td class="text" align="center">R$ '.$data["preco"].'</td>';
         echo '<td class="text" align="center">'.$data["agencia"].'</td>';
         echo '<td class="text" align="center"><a class="link" href="pre_visualizar2.php?codigo='.$data["codigo"].'">Alterar</a></td>';
      echo '</tr>';
Se eu usar assim === $dbvin.agencia=$dbusu.agencia => visualizo todas, logo poderia alterar qualquer uma, o que estaria errado.
Se eu usar assim ( que é o certo ) === $dbvin.agencia='$dbusu.agencia' => não visualizo nada.
 
Back
Topo