1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

SQL INNER JOIN de três Campos

Discussão em 'Web Development' iniciada por silvino, 5 de Junho de 2008. (Respostas: 5; Visualizações: 3849)

  1. silvino

    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: 5 de Junho de 2008
  2. silvino

    silvino Power Member

    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:
     
  3. zoidberg

    zoidberg Folding Member

    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:
     
  4. silvino

    silvino Power Member

    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: 5 de Junho de 2008
  5. zoidberg

    zoidberg Folding Member

    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 ;)
     
  6. 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.
     

Partilhar esta Página