Jump to content
Rogério Orlando

join em várias tabelas

Recommended Posts

Na SQL abaixo, quando consulto as tabelas, os registros se repetem, apresentando mais do que realmente existem.

Alguém pode auxiliar no que está errado ou o que falta para que a select retorne apenas um registro para cada documento?

Esclareço que todas as tabelas tem um campo "documento", porém ele não é chave e no retorno trouxe todos os campos de todas as tabelas e não apenas as dá SQL:

 

 

select so01.documento,so01.digito,so01.nome,so01.regional,so01.situacao,so01.observacao,so01.n_spprev,so01.averbacao,
so02.endereco, so02.numero, so02.bairro,so02.cidade,so02.cep,so02.estado,so02.aniversario,
so03.rg, so03.cpf, so03.email, 
so04.estado_civil, so04.agencia,so04.dg_agencia,so04.conta,so04.dg_conta,so04.banco,so04.ddd,so04.telefone,so04.nascimento,
so04.admissao,so04.demissao_seg,so04.admor,so04.ddd_cel,so04.celular

from so03 
inner join so01 ON so01.documento= so03.documento
inner join so02 ON so02.documento= so03.documento
inner join so04 ON so04.documento=so03.documento 
where so01.documento="68" and so01.digito="0"

 

 

Share this post


Link to post
Share on other sites
Citar

porém ele não é chave 

 

Qual é a chave das tabelas ?

Os nomes das tabelas não ajudam mas pelas colunas temos dados que podem gerar a "duplicidade" pois 

uma pessoas pode ter mais de uma conta e ou celular.

Share this post


Link to post
Share on other sites

Obrigado pelo apoio Motta.

Não tenho muito conhecimento. o banco de dados peguei do serviço para tentar desenvolver, ou seja, não o criei.

Segue uma foto com as tabelas. Nenhuma delas tem informações repetidas como comentou do celular, mas o vínculo existente entre elas é o documento e o dígito, que formam um documento tipo CPF, que não pode ser repetido na mesma tabela.

Fico no aguardo e já agradeço a tentativa.

so.jpg

Share this post


Link to post
Share on other sites

As PKs da tabela é o campo ID.

Que devem ser diferentes pelas tabelas.

Não é exibido se existe uma UNIQUE KEY para documento.

Faça um teste , para um caso "duplidado"

faça um "select * from" para cada uma das tabelas

no documento e veja o resultado.

Eu ainda aposto que a duplicidade é normal e reflete o contéudo.

 

Share this post


Link to post
Share on other sites

Boa noite Motta!

fiz as selects individualmente em cada tabela, e todas retornaram apenas um registro para cada uma.

Todas as tabelas são vinculadas a um campo documento e outro campo dígito (where so01.documento="68" and so01.digito="0"), onde repeti, como solicitado, a consulta nas tabelas so01, so02, so03 e so04, todas com o "where" acima.

Como disse, esse documento, é um tipo de CPF, não tem repetição.

 

Motta!

Poderia me explicar como funciona no meu código, o FROM so03, pois tentei trocar a tabela por uma das outras três e ele dá erro (not unique table/alias 'so...)!!!

 

select so01.documento,...
so02.endereco, ...
so03.rg, ...
so04....

from so03
inner join so01 ON so01.documento= so03.documento
inner join so02 ON so02.documento= so03.documento
inner join so04 ON so04.documento=so03.documento 
where so01.documento="68" and so01.digito="0"
 

Share this post


Link to post
Share on other sites

Motta!

Creio que resolvi. 

Constei um Group By so01.documento e trouxe apenas o que precisava.

 

Agora tenho que entender o From so03, que não consigo constar outra tabela que dá erro, conforme constei acima.

 Se puder me auxiiar fico grato.

Abraço

Share this post


Link to post
Share on other sites

Você só pode citar a tabela uma vez para citar mais de uma precisa trocar o "alias"

Por exemplo
 

select ccdeb.descri ccustodeb , cccred.descri ccustocred , c.data , c.valor
from custos c
inner join centro_custo ccdeb  ON ccdeb.cod= c.ccusto_de
inner join centro_custo cccred ON cccred.cod= c.ccusto_cred

exibir 2 Centro de custo ligados a mesma tabela

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Omar~
      Primeiro a situação porque é difícil de explicar:
      Preciso realizar uma query em duas tabelas uma de pergunta (tabela_A) outra de resposta (tabela_B) usando o operador LIKE
      Ambas possuem uma coluna para o conteúdo, a tabela_A possui também uma coluna para título.
      A tabela_b é possui uma coluna para se relacionar com a tabela_A.
      Então digamos que na tabela_A tenho a seguinte questão:
       
      tabela_A
      Título: João foi ao mercado?
      Conteúdo (pergunta): Alguém sabe se ele comprou arroz?
      tabela_B
      Conteúdo (resposta): Eu vi que joão comprou feijão.
       
      A consulta então seria pela palavra chave joão que poderia está presente nas 2 tabelas e em 3 colunas.
      Tentei da seguinte forma montar a query:
      SELECT tabela_A.id, tabela_A.titulo, tabela_A.pergunta, tabela_B.relacao, tabela_B.resposta FROM tabela_A INNER JOIN tabela_B ON tabela_A.id = tabela_B.relacao WHERE tabela_B.resposta LIKE '%joão%' OR ( tabela_A.titulo LIKE '%joão%' OR tabela_A.pergunta LIKE '%joão%' ) Os problemas são se eu passar o comando ON para relacionar a resposta com a pergunta:
      A query não retorna se não houver dados na tabela_B.
      A query só retorna resultado se for buscado dados pela coluna resposta (mesmo existindo a palavra chave nas colunas citadas da tabela_A).
       
      A questão é:
      Como eu realizaria essa consulta?
      Se a palavra chave for encontrado na coluna titulo, pergunta ou resposta, de forma a que eu irei listar a coluna_A.
      Exemplo:
      Pesquisou por Maria, no título não tem, na pegunta não tem, na resposta tem.
      Pesquisou por Luiz, no título tem,  na pegunta não tem, na resposta não tem.
       
      Ou seja em qualquer um dos campos de ambas colunas que houver a chave de consulta deve retornar dados da coluna_A, mesmo que seja uma resposta na coluna_B.
       
      A forma que estou procedendo mesmo dando o resultado esperado não acho adequado acredito que uma query bastaria.
      Consultar tabela_A pelos campos tilulo e pergunta.
      Consultar tabela_B pelo campo resposta.
      Usar a função no PHP array_merge para unir ambos resultados em um único array.
      Remover os índices duplicados do array unificado.
    • By Quencyjones79
      Olá a todos, sou novo na área de multimídia. Estou a seguir a um momento um ebook sobre a criação de uma base de dados e também a criação de tabelas. Mas quando vinculei as tabelas do banco de dados, no phpmyadmin me deu alguns erros. Fiz a correspondência da chave primária (artist_id da tabela Artist) com a artist_id da tabela Prints (chave estrangeira) e assim por diante. O problema é que ele não mostra minhas relações das tabelas e me dá uma mensagem de erro. Então, alguns de vocês poderiam me ajudar, por favor, a consertar esta situação. Eu serei grato. Cumprimentos.
       
      Ps .: Abaixo envio o arquivo Sql.
       
      Atentamente,

      José Moreira
      -- phpMyAdmin SQL Dump -- version 5.0.2 -- https://www.phpmyadmin.net/ -- -- Host: 127.0.0.1 -- Generation Time: Jan 07, 2021 at 08:49 PM -- Server version: 10.4.14-MariaDB -- PHP Version: 7.2.33 SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; START TRANSACTION; SET time_zone = "+00:00"; /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; /*!40101 SET NAMES utf8mb4 */; -- -- Database: `ecommerce` -- -- -------------------------------------------------------- -- -- Table structure for table `artists` -- CREATE TABLE `artists` ( `artist_id` int(10) UNSIGNED NOT NULL, `first_name` varchar(20) DEFAULT NULL, `middle_name` varchar(20) DEFAULT NULL, `last_name` varchar(40) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- -- Table structure for table `customers` -- CREATE TABLE `customers` ( `customer_id` int(10) UNSIGNED NOT NULL, `email` varchar(60) NOT NULL, `pass` char(40) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- -- Table structure for table `orders` -- CREATE TABLE `orders` ( `order_id` int(10) UNSIGNED NOT NULL, `customer_id` int(10) UNSIGNED NOT NULL, `total` decimal(10,2) UNSIGNED NOT NULL, `order_date` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp() ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- -- Table structure for table `order_contents` -- CREATE TABLE `order_contents` ( `oc_id` int(10) UNSIGNED NOT NULL, `order_id` int(10) UNSIGNED NOT NULL, `print_id` int(10) UNSIGNED NOT NULL, `quantity` tinyint(3) UNSIGNED NOT NULL DEFAULT 1, `price` decimal(6,2) UNSIGNED NOT NULL, `ship_date` datetime DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- -------------------------------------------------------- -- -- Table structure for table `prints` -- CREATE TABLE `prints` ( `print_id` int(10) UNSIGNED NOT NULL, `artist_id` int(10) UNSIGNED NOT NULL, `print_name` varchar(60) NOT NULL, `price` decimal(6,2) UNSIGNED NOT NULL, `size` varchar(60) DEFAULT NULL, `description` varchar(255) DEFAULT NULL, `image_name` varchar(60) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4; -- -- Indexes for dumped tables -- -- -- Indexes for table `artists` -- ALTER TABLE `artists` ADD PRIMARY KEY (`artist_id`), ADD UNIQUE KEY `full_name` (`last_name`,`first_name`,`middle_name`); -- -- Indexes for table `customers` -- ALTER TABLE `customers` ADD PRIMARY KEY (`customer_id`), ADD UNIQUE KEY `email` (`email`), ADD KEY `login` (`email`,`pass`); -- -- Indexes for table `orders` -- ALTER TABLE `orders` ADD PRIMARY KEY (`order_id`), ADD KEY `customer_id` (`customer_id`), ADD KEY `order_date` (`order_date`); -- -- Indexes for table `order_contents` -- ALTER TABLE `order_contents` ADD PRIMARY KEY (`oc_id`), ADD KEY `order_id` (`order_id`), ADD KEY `print_id` (`print_id`), ADD KEY `ship_date` (`ship_date`); -- -- Indexes for table `prints` -- ALTER TABLE `prints` ADD PRIMARY KEY (`print_id`), ADD KEY `artist_id` (`artist_id`), ADD KEY `print_name` (`print_name`), ADD KEY `price` (`price`); -- -- AUTO_INCREMENT for dumped tables -- -- -- AUTO_INCREMENT for table `artists` -- ALTER TABLE `artists` MODIFY `artist_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT; -- -- AUTO_INCREMENT for table `customers` -- ALTER TABLE `customers` MODIFY `customer_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT; -- -- AUTO_INCREMENT for table `orders` -- ALTER TABLE `orders` MODIFY `order_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT; -- -- AUTO_INCREMENT for table `order_contents` -- ALTER TABLE `order_contents` MODIFY `oc_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT; -- -- AUTO_INCREMENT for table `prints` -- ALTER TABLE `prints` MODIFY `print_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT; COMMIT; /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
       

    • By janir.matheus
      Boa tarde, peço ajuda dos membros desse fórum pois confesso estar completamente perdido.
      Tomando como base o diagrama (em anexo), preciso de uma query que retorne as empresas, seus produtos e as categorias de cada produto, sendo que cada produto pode pertencer a uma ou mais categorias.
       
      select tbl_produtos.Empresa, tbl_empresas.Nome, tbl_catprod.Categoria, tbl_classproduto.Classe, tbl_produtos.Id, tbl_produtos.Produto from tbl_produtos inner join tbl_empresas on tbl_produtos.Empresa = tbl_empresas.Id left join tbl_catprod on tbl_produtos.Id = tbl_catprod.Categoria left join tbl_classproduto on tbl_catprod.Categoria = tbl_classproduto.Id; Tentei a consulta mostrada acima mas o resultado não foi o que eu esperava.
      Agradeço antecipadamente pela ajuda.

    • By henrybrion
      Caros, estou criando um sistema de listagem de produtos em que os mesmos sejam apresentados de acordo com sua categoria.
      O sistema funciona da seguinte forma:
      Os dados são cadastrados no BD "mercado" na tabela produtos contendo 4 campos (id, produto, categoria e preço) e as categorias são cadastradas na tabela categoria contendo 2 campos (id e categoria).
      Na página produtos.php deve ser apresentado da seguinte forma:
      As categorias são relacionadas em TABs e os produtos em Tabela, de acordo com sua categoria, ou seja se tenho a categoria "Bebidas" deve ser apresentado todas as Bebidas desta categoria na TAB Bebidas e assim por diante.
      Porém não estou conseguindo fazer isso, só está sendo apresentado os produtos da primeira categoria e repetindo nas demais.
      Segue o código que estou usando para construção:
       
      Página Produtos.php
      <div class="container"> <h2>Lista de Produtos por Categoria</h2> <br><br> <?php include_once 'select_produtos.php'; ?> <ul class="nav nav-tabs nav-pills nav-justified"> <?php echo $categorias_menu; ?> </ul> <div class="tab-content"> <table class="table table-hover"> <thead class="thead-dark"> <tr> <th scope="col">Código</th> <th scope="col">Produto</th> <th class=" text-center" scope="col">Valor</th> </tr> </thead> <tbody> <?php echo $lista_produtos; //faz a chamada para a variável no arquivo "select_produtos.php" ?> </tr> </tbody> </table> </div> </div> Página Select_produtos.php
       
      <?php include_once 'conexao.php'; $categorias_sql = "SELECT * FROM categorias ORDER BY id ASC"; $categorias_result = mysqli_query( $connect, $categorias_sql ); $categorias_menu = ''; $produtos_query = "SELECT * FROM produtos ORDER BY produto ASC"; $produtos_result = mysqli_query( $connect, $produtos_query ) or die ("database error:". mysqli_error($connect)); $lista_produtos = ''; $i = 0; //EXIBIR O MENU - ABAS - DE CADA CATEGORIA while ( $categorias = mysqli_fetch_array( $categorias_result ) ) { if ( $i == 0 ) { $categorias_menu .= ' <li class="active"> <a href="#' . $categorias[ "id" ] . '" data-toggle="tab" role="tab">' . $categorias[ "categoria" ] . '</a> </li> '; $lista_produtos .= ' <div id="' . $categorias[ "id" ] . '" class="tab-pane fade in active"> '; } else { $categorias_menu .= ' <li> <a href="#' . $categorias[ "id" ] . '" data-toggle="tab" role="tab">' . $categorias[ "categoria" ] . '</a> </li> '; $lista_produtos .= ' <div id="' . $categorias[ "id" ] . '" class="tab-pane fade"> '; } $i++; //Verfica se existem produtos na tabela if(!mysqli_num_rows($produtos_result)) { $lista_produtos .= '<br>Produto não encontrado!'; }else{ //LISTANDO PRODUTOS NO FORMATO DE TABELA while ( $sub_row = mysqli_fetch_array( $produtos_result ) ) { if($sub_row['categoria_id'] == $categorias['id']){ $lista_produtos .= '<tr>'; $lista_produtos .= '<td class="text-uppercase">' . utf8_encode($sub_row[ "id" ]) . '</td>'; $lista_produtos .= '<td class="text-uppercase">' . utf8_encode($sub_row[ "produto" ]) . '</td>'; $lista_produtos .= '<td class="text-uppercase text-center">R$ ' . $sub_row[ "preco" ] . '</td>'; } } } } $lista_produtos .= '<div style="clear:both">'; ?> Onde está meu erro ou o que estou deixando de fazer aqui?
      Segue imagem da tela como quero que fique.
       
      Obrigado.

    • By Aureo Almeida
      Problema em definir largura e disposição horizontal de tabelas com resultado de while
      Como iniciante em programação estou tendo problemas para estilizar uma tabela dentro de um script PHP. Possuo o seguinte script:
      <?php $sql = 'SELECT * FROM psd_produtos'; $stmt = $conn->query($sql); echo '<table>'; while($row = $stmt->fetch(PDO::FETCH_OBJ)){ echo " <td> <tr><h1>$row->prd_nome <br /></h1></tr> <tr><p>$row->prd_detalhe <br /></p></tr> <tr>$row->prd_valor <br /></tr> </td> "; } echo '</table>'; ?> Ele funciona perfeitamente, buscando e produzindo um loop das informações que preciso, porém, gostaria que o resultado me retornasse em tabelas que ficasse dispostas horizontalmente lado a lado, e imaginei colocar uma classe CSS que estabelecesse a largura da tabela em 400px com um float que me permitiria alinhar o resultado em “4 colunas”. Porém, essa classe não funciona dentro do script.
      Tentei echo '<table class="tabela-produto">'; e não funciona.
      A mesma classe, que estabelece uma largura para a tabela, aplicada a uma tabela fora do script funciona e isso tirou minha dúvida se este tópico seria sobre CSS/HTML ou PHP.
      Como posso fazer para obter meu objetivo com este script, alinhando horizontalmente o resultado do while em tabelas dispostas horizontalmente em 4 colunas?
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.