Ir para conteúdo
Omar~

JOIN em 3 Tabelas

Recommended Posts

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em tese sim , mas o desempenho depende de fatores , como índices , tamanho das tabelas , estatísticas atualizadas etc.

Quanto a ordem (pages,sectors e users) e o tipo do "join" ("inner") só dá para opinar conhecendo o Sistema em si.

Compartilhar este post


Link para o post
Compartilhar em outros sites
12 horas atrás, Motta disse:

desempenho depende de fatores

A questão é essa o desempenho... E a tabela "pages" possui mais de 16.000 registros.

 

O negócio é um website de uma prefeitura ao qual estou adicionando recursos administrativos, pois não havia um recurso para saber o que já foi postado a não ser indo paginando nas postagens, e quero implementar justamente uma lista de tudo, de forma a um click acessar uma postagem, editar/excluir de forma rápida.

 

A arquitetura fica sendo:

Tabela "sectors" é usada para armazenar que tipo de postagem é (Saúde, educação etc...)

Tabela "pages" é usada para armazenar os post's referentes a cada tipo de postagem.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não programo sites , mas creio que fará o site ficar pesado ou é só um relatório ("lista de tudo") ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como disse só uma listagem para o administrador do sistema saber tudo que já foi postado.

Na via de tal como meu prazo está apertado e como desse jeito não vi problemas de performasse deixei como está.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • 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 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.
       
    • Por Luiz Henrique
      Olá pessoas,
       
      Preciso fazer uma consulta em 3 tabelas, mas quando insiro a 3ª na consulta já duplica resultados:
      Tabela ticket
      id,  id_cliente
       
      Tabela clientes
      id, nome
       
      Tabela servicos_ticket
      id, id_ticket, valor_ticket
       
      Aqui OK
      SELECT ticket.*, clientes.* FROM ticket JOIN clientes ON ticket.id_cliente = clientes.id Mas aqui duplica, porque um ticket pode ter vários serviços cadastrados.
      ticket.*, clientes.*, servico_ticket.* FROM ticket JOIN clientes ON ticket.id_cliente = clientes.id JOIN servico_ticket ON ticket.id = servico_ticket.id_ticket A listagem tem que ser apenas dos tickets cadastrados, tentei colocar DISTINCT ticket.* mas não adianta.
      o resultado deveria ser algo assim:
       
      12344 luiz 10.00
      12345 henrique 20.00
       
      mas se o ticket do luiz tiver 3 serviços cadastrados
       
      12344 luiz 10.00
      12344 luiz 10.00
      12344 luiz 10.00
      12345 henrique 20.00
       
      e deveria ser apenas 1, aí eu faria a soma dos valores
       
      12344 luiz 30.00
       
      Como elimino essa duplicação?
      Deu para entender?
      Obrigado.
×

Informação importante

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