Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

nique2049

INNER JOIN com várias tabelas

Recommended Posts

Oi gente, tudo bom?

Estou desenvolvendo um site em que o usuário entra com características de uma ave (Sterna) e o site retorna as aves com aquelas características. Porém estou tendo um problema com a consulta  de 3 tabelas que se relacionam com a tabela principal (relação n pra n). As tabelas são:

 

tb_sterna

58ec03432a309_Screenshot2017-04-1019_06_11.png.33b30b5332a3a852ce7efb4a52b2ce9a.png

 

tb-bico_cor_base

58ec03435c34f_tbcor.png.392e0424721137ea4a59613c333d9530.png

 

tb_sterna_has_tb_bico_cor_base

58ec03c94bf35_tbhas.png.165635ffe6cd38d688c76c7efada7a02.png

 

Seguindo a mesma lógica, ainda tem:

  • tb_bico_cor_meio
  • tb_bico_cor_ponta
  • tb_sterna_has_tb_bico_cor_meio
  • tb_sterna_has_tb_bico_cor_ponta

Resumindo: uma mesma espécie de Sterna pode ter várias cores de bico e as cores podem estar presente em diferentes espécies.

Como eu faço se, por exemplo, o usuário entrar com os dados:

  • cor do píleo: preto
  • cor da perna: vermelho
  • cor da ponta do bico: amarelo
  • cor da base do bico: vermelho
  • cor da região mediana do bico: preto

 

Como eu faço essa busca usando um select só? Muito obrigada :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

TODAS as caracteristicas devem ser atendidas ou só algumas ?

 

Pesquise por JOIN  e condições WHERE 

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 10/04/2017 at 21:49, Motta disse:

TODAS as caracteristicas devem ser atendidas ou só algumas ?

 

Pesquise por JOIN  e condições WHERE 

Como  Motta falou, você tem que saber qual resultado você ta buscando da sua consulta olhe também os operadores like e in alem desses já citados.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 10/04/2017 at 21:49, Motta disse:

TODAS as caracteristicas devem ser atendidas ou só algumas ?

 

Pesquise por JOIN  e condições WHERE 

 

Acho que não deixei muito claro o problema hahaha o negócio é que eu tenho que linkar a tabela tb_sterma com três tabelas diferentes (tb_bico_cor_base, tb_bico_cor_meio e tb_bico_cor_ponta).

 

Eu consigo achar pela cor de uma das partes do bico:

 

SELECT nome_cientifico FROM `tb_sterna` 
INNER JOIN tb_sterna_has_tb_bico_cor_base ON tb_sterna.codigo_sterna=tb_sterna_has_tb_bico_cor_base.codigo_sterna
INNER JOIN tb_bico_cor_base ON tb_sterna_has_tb_bico_cor_base.codigo_bico_cor_base=tb_bico_cor_base.codigo_bico_cor_base WHERE tb_bico_cor_base.codigo_bico_cor_base=1

 

Consigo achar pras características que são da tabela sterna:

 

SELECT nome_cientifico FROM `tb_sterna` WHERE cor_pileo='preto' AND cor_perna='vermelho'

 Mas não consigo juntar tudo:

SELECT nome_cientifico FROM `tb_sterna` WHERE cor_pileo='preto' AND cor_perna='vermelho'
INNER JOIN tb_sterna_has_tb_bico_cor_base ON tb_sterna.codigo_sterna=tb_sterna_has_tb_bico_cor_base.codigo_sterna
INNER JOIN tb_bico_cor_base ON tb_sterna_has_tb_bico_cor_base.codigo_bico_cor_base=tb_bico_cor_base.codigo_bico_cor_base WHERE tb_bico_cor_base.codigo_bico_cor_base=1

Desse jeito aí de cima ele dá erro pq tem dois WHERE. E se eu tento colocar o Inner join das outras tabelas, aí que dá tudo errado:

SELECT nome_cientifico FROM `tb_sterna` WHERE cor_pileo='preto' AND cor_perna='vermelho'
INNER JOIN tb_sterna_has_tb_bico_cor_base ON tb_sterna.codigo_sterna=tb_sterna_has_tb_bico_cor_base.codigo_sterna
INNER JOIN tb_bico_cor_base ON tb_sterna_has_tb_bico_cor_base.codigo_bico_cor_base=tb_bico_cor_base.codigo_bico_cor_base WHERE tb_bico_cor_base.codigo_bico_cor_base=1
INNER JOIN tb_sterna_has_tb_bico_cor_mediana ON tb_sterna.codigo_sterna = tb_sterna_has_tb_bico_cor_mediana.codigo_sterna
INNER JOIN tb_bico_cor_mediana ON tb_sterna_has_tb_bico_cor_mediana.codigo_bico_cor_mediana=tb_bico_cor_mediana.codigo_bico_cor_mediana WHERE tb_bico_cor_base.codigo_bico_cor_base=2
INNER JOIN tb_sterna_has_tb_bico_cor_ponta ON tb_sterna.codigo_sterna=tb_sterna_has_tb_bico_cor_ponta.codigo_sterna
INNER JOIN tb_bico_cor_base ON tb_sterna_has_tb_bico_cor_ponta.codigo_bico_cor_ponta=tb_bico_cor_ponta.codigo_bico_cor_ponta WHERE tb_bico_cor_ponta.codigo_bico_cor_ponta=3

 

Tem como eu fazer essa consulta em um select só? Se não tem, como eu posso fazer?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pensou em mudar o modelo , criar uma tabela de (partes_do_corpo x cor)  , outra (partes_do_corpo x existencia) ?

 

Modelos complicados geram sqls desnecessariamente complicados.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por aw10home
      Quando faço a consulta no phpMyadmim consigo o resultado esperado. Mas pelo visto não estou sabendo fazer direito em PHP. O que estou errando? Porque não consigo fazer a média (prtm) "aparecer"?
      abaixo meu código.
      <?php if (isset($_GET['$id_aluno'])){ $id_aluno = addslashes($_GET['$id_aluno']);} elseif (isset($_GET['id_aluno'])){ $id_aluno = addslashes($_GET['id_aluno']);}//addslashes evita sqlinjection else{ $id_aluno=(""); } $informacao=$con->prepare("SELECT a.id_aluno, a.nome, SUM(((b.prt*5)+(m.prt*3)+(v.prt*2))/10 ) as prtm FROM aluno a inner join avb1 b on a.id_aluno = b.id_aluno inner join avm2 m on a.id_aluno = m.id_aluno inner join avp v on a.id_aluno = v.id_aluno group by a.id_aluno, a.nome WHERE a.id_aluno = $id_usuario"); $informacao->execute(); ?> <!------------> <table class="cBolt"> <tr> <td>Avaliação</td> <td>Bim.</td> <td>Português</td> </tr> <?php while($linha=$informacao->fetch(PDO::FETCH_ASSOC)){ ?> <tr> <td>Média</td> <td>1º</td> <td><?php echo $linha['prtm'];?></td> </tr> <?php } ?> </table>  
    • Por lucianfpaula
      Galera tenha a seguinte duvida, tenho 3 tabelas onde estou trazendo os dados e preciso fazer um count em uma delas
       
      SELECT *  FROM tabela1 AS t1  INNER JOIN tabela2 AS t2 ON t1.idt1 = t2.idt2 INNER JOIN tabela3 AS t3 ON t3.idt3 = t1.idt1  
      a duvida é: quero manter o SELECT * mas também preciso de COUNT(t3.idT3)
      não sei se é possível fazer isso, mas gostaria de ter certeza antes de focar em outra solução
      desde já muito grato.
    • Por r.guerra
      Salve galera, boa tarde a todos.
      estou tendo um problema que ainda nao consegui enxergar... faço uma consulta mysql que funciona normalmente no proprio ambiente(mysql) mas ao solicitar a exibição do campo via php gera nao exibe e me tras um alerta.
       
      ****codigo php
      function monta_avaliacao($cpf){
          $query = mysqli_query($_SESSION["conector"],"SELECT c.*, a. cliente AS clientes FROM clientes AS c INNER JOIN avaliacoes AS a ON c.id = a.cliente WHERE c.cpf='$cpf'");
           $dados = mysqli_fetch_assoc($query);
          print $dados['c.cpf'];
           }
       
      *****sainda no html
      Notice: Undefined index: c.cpf in C:\xampp\htdocs\acus\inclusoes\funcoes.php on line 29
      Notice: Undefined index: a.pe in C:\xampp\htdocs\acus\inclusoes\funcoes.php on line 30
       
      tenho um arquivo com as funções, e apenas mando os parametros.
    • Por Omar~
      Então alguém teria uma ideia se existe uma forma mais correta (otimizada) para está executando uma query como essa:
      SELECT pages.p_hash, pages.p_title, pages.p_sector, pages.p_created, sectors.s_hash, sectors.s_title, sectors.s_link, users.u_hash, users.u_name FROM pages INNER JOIN sectors ON pages.p_sector = sectors.s_hash INNER JOIN users ON pages.p_created = users.u_hash  
      Não que venha ao caso mas por explicação mesmo.
      Entro na tabela páginas setores e usuários . Pois tenho que apresentar dados da página, o setor onde se encontra e quem foi o autor
    • Por Rodymb
      Bom dia!
      Estou fazendo um select em uma tabela de cupom fiscal e preciso que me mostre o operador do caixa e o supervisor que liberou a venda, que no caso é convênio.
      A consulta que montei é a seguinte:
       
      select  c.m00ad as CUPOM,
              c.m00ac as PDV,
              c.m02ak as VALOR,
              p.descricao as FINALIZADORA,
              c.m02ah as OPERADOR,
              f.nome as NOME_OP,
              c.m02ao as SUPERVISOR,
              f.nome as NOME_SUP
      from zan_m02 c inner join tab_funcionario f
      on c.m02ao = f.cod_funcionario
      inner join tab_finalizadora p
      on c.m02ai = p.cod_finalizadora
      where c.m00af = to_date('09/03/20','dd/mm/yy')
      and c.m00za = 3
      and c.m00ac = 9
      and c.m00ad = 379678
      group by c.m00ad,c.m00ac,c.m02ak,p.descricao,c.m02ah,f.nome,c.m02ao;
       
      A consulta me retorna o seguinte resultado:

       
      Como podem ver, repetiu o mesmo nome (operador e supervisor), sendo que o código é diferente.
       
      Isso acontece por que na tabela de funcionário o campo NOME serve para operador e supervisor e o que diferencia se é supervisor ou operador temos mais duas outras tabelas. A estrutura é assim:
       
      tab_funcionario -> temos o campo cod_funcionario e nome (todos os funcionários cadastrados são armazenados nessa tabela)
      tab_perfil -> temos os campos cod_perfil e descricao (todos os perfis cadastrados são armazenados nessa tabela)
      tab_perfil_funcionario -> temos os campos cod_funcionario e cod_perfil (tabela que relaciona as tabelas tab_funcionario e tab_perfil)
       
      A única coisa que preciso é que apareça no NOME_OP o nome do operador e não o nome do supervisor igual está aparecendo.
       
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.