+6

PHP e MySQL - JOINS em 2 tabelas ou mais

criado por Michael Colla em 06/11/2008 9:37am
E aí pessoal do fórum, este é meu primeiro artigo aqui no fórum e espero que possa ser útil!
Bom, me deparei com a seguinte situação: eu tinha 2 bancos de dados MySQL, e precisava montar uma tabela HTML, que exibisse os dados de 3 tabelas, onde 2 se encontravam no banco base e 1 no banco clientes.

Pra vocês entenderem, vamos simular que temos 2 bancos (base e clientes).
No banco base, temos as tabelas (usuario e uf), que armazenam o id e nome do usuário, e id e sigla UF respectivamente.
E no banco clientes, temos 1 tabela que se chama pedidos, que armazena o pedido, o id do usuario(que fez o pedido), e o id da sigla UF, e a data do pedido.
Inicialmente, eu fazia a consulta e utilizava um laço while, e pelo id (do usuario e uf), eu fazia outra consulta pra pegar o nome e a sigla. Veja abaixo:



OK, funciona certinho, mas, pensando em desempenho, se em uma consulta obtivéssemos 30 resultados, essas outras 2 consultas dentro do while resultariam em mais 60 consultas ao banco.
E se em determinado momento 9 usuários realizassem a mesma consulta com os 30 resultados, resultariam em 540 consultas, resumindo, percebi o tamanho da redundância e perda de desempenho.

Comentários:

Mostrando 1 - 10 de 13 comentários
Michael Colla disse:
Olá, estou precisando de ajuda urgente, tenho duas tabelas no MySql e preciso fazer uma consulta na tabela associados através do resultado do login na tabela usuarios, ou seja, esta consulta:
select * from associados where IdAssociado=IdAssocidado(da tabela usuarios que foi logada na pagina de login). Então como resultado deve aparecer todos os dados do associado. Se fosse em delphi, vb, já tinha feito, mas, em php não sei como pegar o parâmetro da pagina de login para enviar para a pagina de consulta da tabela e preencher os dados. Se alguém puder me ajudar eu agradeço e me ponho a disposição a fazer o mesmo. Obrigado.

Alex, bom, é recomendável que você envie o formulário via post, assim, na página que vai consultar, você faz algo semelhante:
$sql = mysql_query("Select * from associados where email=".$POST['login']." AND senha='".$POST['senha']."' LIMIT 1;");
if ($sql){
//usuario encontrado, redireciona p/ index.php, por exemplo
} else {
print "dados não conferem", e redireciona pra login.php
}

Lógico que isso ae tá super simples, sem validação, segurança e tal, mas com esse código vc já consegue logar o usuario.
Dá uma olhada na sessão de scripts do site que tem sistemas de logins completos e funcionais.
Espero ter ajudado!
13/08/2010 3:50pm (~6 anos atrás)

Alex Sander disse:
Olá, estou precisando de ajuda urgente, tenho duas tabelas no MySql e preciso fazer uma consulta na tabela associados através do resultado do login na tabela usuarios, ou seja, esta consulta:
select * from associados where IdAssociado=IdAssocidado(da tabela usuarios que foi logada na pagina de login). Então como resultado deve aparecer todos os dados do associado. Se fosse em delphi, vb, já tinha feito, mas, em php não sei como pegar o parâmetro da pagina de login para enviar para a pagina de consulta da tabela e preencher os dados. Se alguém puder me ajudar eu agradeço e me ponho a disposição a fazer o mesmo. Obrigado.
13/08/2010 2:45pm (~6 anos atrás)

Olá Michael!

Parabéns pelo artigo! Me ajudou muito! Conseguiu esclarecer de forma simples o uso do Join. Parabéns e obrigado!
11/03/2010 9:47am (~6 anos atrás)

Michael Colla disse:
Então ClaudioCR, em PHP é simples, vou usar como exemplo, uma tabela onde você queira os clientes de um estado.
A query seria esta:
SELECT * FROM clientes WHERE clientes.id_estado = 1;
Neste caso, temos um inteiro como parâmetro, então:
SELECT * FROM clientes WHERE clientes.id = $variavel;

Supondo que o parâmetro fosse uma string:
SELECT * FROM clientes WHERE clientes.nome = '".$variavel."';

Espero que tenha ajudado, qualquer coisa estamos ae!
08/02/2010 8:58am (~6 anos atrás)

ClaudioCR disse:
Olá, estou procurando e ainda não encontrei.
Postei minha duvida no mysql.com, mas ateh agora ninguém me respondeu.
Não foge muito do tema deste post.
E se os valores fossem inseridos via variãvel? Como uso o % com $variavel? Ex:
"LIKE '%$atividade%'"
Para ver o post no mysql.com o link:
http://forums.mysql.com/read.php?52,325108,325108#msg-325108
07/02/2010 1:36pm (~6 anos atrás)

Michael Colla disse:
Olá Amanda, obrigado por seu comentário. Espero que possa te ajudar na resolução da sua dúvida.
Assumindo que temos uma tabela de disciplinas, e que nessa tabela temos um campo, vamos chamá-lo de id_disciplina, que vem a ser um campo único que vai representar cada uma das disciplinas.
Já na tabela professores, teremos também um campo único que será a identificação dos professores, que vamos chamá-lo de id_professor.
Bom, agora temos que entender uma coisa. Nos banco de dados, existe algo chamado relacionamentos, que nada mais é do que ligações, entre 2 ou mais tabelas. Temos 3 tipos de relacionamentos: um para um, um para muitos e muitos para muitos. Só vou explicar a respeito do muitos para muitos, que é o nosso caso. Quando há um relacionamento assim entre 2 tabelas, não podemos interligá-las diretamente. Veja, pra ficar fácil, vamos supor que temos 3 disciplinas, e 5 professores. Os 2 primeiros professores, lecionam a disciplina 1 e 2. Já os ultimos 3 professores, lecionam a disciplina 3. Não tem como definir isso, diretamente entre essas 2 tabelas. Então, quando há esse tipo de relacionamento, temos que criar uma tabela associativa. Que nada mais é do que uma tabela, onde cada registro vai armazenar o id do professor e o id da disciplina que leciona. Assim, vc pode ter 50 ou quantos professores forem necessários que lecione na determinada determinada disciplina. A nossa vai se chamar leciona_disciplina.
Assim, montamos a seguinte query:

SELECT d.nome
FROM disciplinas d
JOIN leciona_disciplina lec ON lec.id_disciplina = d.id_disciplina
JOIN professores p ON p.id_professor = lec.id_professor
WHERE lec.id_professor =2

Nessa consulta, serão listados todas as disciplinas que o professor com o id 2 leciona.

Qualquer dúvida, é só falar!
28/10/2009 10:49am (~7 anos atrás)

Amanda disse:
adorei o artigo.

estou criando uma pauta eletronica na qual, quando o professor se logar deverá aparecer SOMENTE AS DISCIPLINAS QUE ELE DÁ AULA. gostaria de saber como se faz isso.
desde já agradeço a colaboração.
28/10/2009 3:18am (~7 anos atrás)

Muito bom seu artigo.
Já sabia como fazer JOINS, mas tive bastante dificuldade em aprender por falta de explicações legais como essa.

E faço como o Joelson postou, é a mesmo por menos.

Valeu.
01/10/2009 2:27pm (~7 anos atrás)

Muito bom, com esse artigo eu aprendi a usar o JOIN.

Agora falta eu aprender Select aninhado.
21/07/2009 12:46am (~7 anos atrás)

Michael Colla disse:
Zariel, fico contente em saber que o artigo foi útil pra você!

Joelson, obrigado pelo complemento, realmente eu não conhecia essa forma de junção. Mas prefiro utilizar o JOIN a modelo que exemplifiquei no artigo, pensando na manutenção do sistema. Fica mais fácil identificar quem é quem, ainda mais se você tiver junção com 3 ou mais tabelas.

Valeu!



19/06/2009 8:37am (~7 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)