Ir para conteúdo

POWERED BY:

Arquivado

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

suelystonn

Select em 3 tabelas, como fazer?

Recommended Posts

Olá Pessoal,

 

Sou novo aqui, e gostaria que vocês me ajudassem em um probleminha que estou tendo.

 

É o seguinte, estou fazendo um sistema de cadastro, só que os usuários estão separados em 3 tabelas, então gostaria de saber como fazer um select nas 3 tabelas para verificar se o usuário já existe em alguma. As tabelas são:

 

 

ativo | pendente | treinamento
--------------------------------------------------------------------
Em cada uma dessas tabela existe o campo login, e o que quero fazer é um select no campo login nas 3 tabelas de uma vez só. Já procurei na net mas não encontro nenhum código que funcione para o meu caso
Não tenho muita experiencia em PHP, então fica difícil pra mim. O código que tenho faz o select em apenas uma tabela:
$pesquisar = mysql_query("SELECT * FROM pendente WHERE login = '$login'", $dbconnect); //conferimos se o login escolhido já não foi cadastrado
$contagem = mysql_num_rows($pesquisar); //traz o resultado da consulta acima

 

 

Lembrando que todos os campos das tabelas não são iguais. Só alguns...

 

Quem puder me ajudar... Agradeço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro, isso não é questão de PHP e sim SQL.

Segundo, use UNION para verificar nas 3 tabelas (apesar de achar que essa modelagem por si só tem problemas).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Primeiro, isso não é questão de PHP e sim SQL.

Segundo, use UNION para verificar nas 3 tabelas (apesar de achar que essa modelagem por si só tem problemas).

 

Mas pra usar UNION, os campos das tabelas devem ser iguais, e como ja falei existem campos que tem em uma tabela que nao tem em outra. Ou estou errado?

 

essa modelagem esta de fato estranha.

 

qual a necessidade de isso estar me outra tabela?

 

É que no sistema que estou criando, os membros cadastrados serão inseridos na tabela 'pendente' e após o cadastro ser liberado, eles iram fazer um treinamento (tabela treinamento), e após o treinamento eles estão ativos no sistema (tabela ativo). Entendeu?

 

Você tem alguma lógica melhor pra fazer esse tipo de coisa? Se tiver por favor me da uma ajuda?

 

Obrigado :D

Compartilhar este post


Link para o post
Compartilhar em outros sites

um campo na tabela de usuário resolve isso.

 

status ou algo parecido.

 

e também existe o LEFT JOIN

 

Acho que não da muito certo fazer apenas uma tabela e fazer tipo um filtro através de um campo, pois as 3 tabelas tem campos diferentes que não podem ser preenchidos na hora do cadastro. Por exemplo, na tabela 'treinamento' existe o campo 'blog' que só pode ser preenchido quando quando ele estiver na fase 3 do treinamento (existe o campo 'fasetrena' na tabela treinamento). Na tabela 'ativo' existe também o campo 'créditos' que só serve para os usuários que estão ativos no sistema (tabela 'ativo')

 

Resumindo ficaria uma bagunça só, pois varios campos não ficariam preenchidos e só poderiam ser preenchidos depois. Por isso que fiz a separação por tabela, para organizar melhor.

 

Uma forma de fazer oque eu quero é fazer três consultas:

 

$pesquisar = mysql_query("(SELECT * FROM pendente WHERE login = '$login')"); //conferimos se o login está na tabela pendente
$contagem = mysql_num_rows($pesquisar); //traz o resultado da consulta acima

$pesquisar2 = mysql_query("(SELECT * FROM ativo WHERE login = '$login')"); //conferimos se o login está na tabela ativo
$contagem2 = mysql_num_rows($pesquisar2); //traz o resultado da consulta acima

$pesquisar3 = mysql_query("(SELECT * FROM treinamento WHERE login = '$login')"); //conferimos se o login está na tabela treinamento
$contagem3 = mysql_num_rows($pesquisar3); //traz o resultado da consulta acima

if ( $contagem == 1 OR $contagem2 == 1 OR $contagem3 == 1) {
	$errors .= "Este login já está cadastrado! Tente outro!"; //se o login já existir, ele adiciona o erro
 	}

 

 

Mas dessa forma eu acho que ficaria muito lento, principalmente quando tiver muitos usuarios.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Simples crie uma única tabela e coloque um campo status

 

0 = Pendente

1 = Ativo

2 = Treinamento

 

Se tem campos diferentes na hora do cadastro algo determina essa diferença, faça a condição por esse algo

Compartilhar este post


Link para o post
Compartilhar em outros sites

todas as colunas da sua tabela não precisam estar obrigatoriamente preenchidas.

 

crie os campos que precisar, e quando quiser pegar a informação de uma pessoa esta em treinamento o campo estará preenchido.

 

ainda não vi a necessidade de separar tudo sendo que é tudo a mesma coisa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas pra usar UNION, os campos das tabelas devem ser iguais, e como ja falei existem campos que tem em uma tabela que nao tem em outra. Ou estou errado?

Sim, você está errado...

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sempre trabalho com esse campo, STATUS, tipo SET 1,2,3

 

Trabalhe com índice numérico, pois são mais rápidos de se processar do que STR.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo quando precisei utilizei o método abaixo:

SELECT tab1.*, tab2.*, tab3.* FROM tabela1 tab1, tabela2 tab2, tabela3 tab3 WHERE tab1.campo1 = '$suaconsulta' AND tab1.campo1 = tab2.campo1 AND tab2.campo1 = tab3.campo1


Espero ter ajudado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo quando precisei utilizei o método abaixo:

 

SELECT tab1.*, tab2.*, tab3.* FROM tabela1 tab1, tabela2 tab2, tabela3 tab3 WHERE tab1.campo1 = '$suaconsulta' AND tab1.campo1 = tab2.campo1 AND tab2.campo1 = tab3.campo1

 

Espero ter ajudado!

 

 

Desculpa a ignorância, mas o código é pra ficar assim né:

 

$pesquisar = mysql_query("SELECT tab1.*, tab2.*, tab3.* FROM ativo tab1, pendente tab2, treinamento tab3 WHERE tab1.login = '$login' AND tab1.login = tab2.login AND tab2.login = tab3.login");
$contagem = mysql_num_rows($pesquisar);

if ( $contagem == 1 ) {
	$errors .= "Este login já está cadastrado! Tente outro! </br>"; //se o login já existir, ele adiciona o erro
 	}

 

 

Só que desse modo não ta funcionando! O lance de fazer apenas uma tabela e fazer o filtro não fica muito legal pois fica muito desorganizado. Então acho melhor separar os users pelas 3 tabelas mesmo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sua query está incorreta e não faz o menor sentido. o que você ta tentando fazer afinal ?

Estou iniciando agora é não sei basicamente nada de SQL.

 

Bem estou tentando fazer um sistema de cadastro, só que os usuários(login) serão separados por 3 tabelas (ativo, pendente,treinamento).

 

Em cada uma das 3 tabelas existe a coluna "login", então na hora do cadastro, quero fazer um select nas 3 tabelas para verificar se o 'login' que o usuario informar no formulário já existe em algumas das 3 tabelas.

 

Como já mostrei, posso fazer isso deste modo:

$pesquisar = mysql_query("(SELECT * FROM pendente WHERE login = '$login')"); //conferimos se o login está na tabela pendente
$contagem = mysql_num_rows($pesquisar); //traz o resultado da consulta acima

$pesquisar2 = mysql_query("(SELECT * FROM ativo WHERE login = '$login')"); //conferimos se o login está na tabela ativo
$contagem2 = mysql_num_rows($pesquisar2); //traz o resultado da consulta acima

$pesquisar3 = mysql_query("(SELECT * FROM treinamento WHERE login = '$login')"); //conferimos se o login está na tabela treinamento
$contagem3 = mysql_num_rows($pesquisar3); //traz o resultado da consulta acima

if ( $contagem == 1 OR $contagem2 == 1 OR $contagem3 == 1) {
	$errors .= "Este login já está cadastrado! Tente outro!"; //se o login já existir, ele adiciona o erro
 	}

 

Mas dessa forma fica muito lento, principalmente quando já tiver muitos usuarios(login) cadastrados, pois ta fazendo 3 consultas.

 

Então oque exatamente eu quero, é fazer apenas uma consulta nas 3 tabelas de uma vez só, pois ficaria mais rápido. Acho que não tem nada a ver com relacionamento de tabelas.

 

Se puder me ajudar, agradeço.

Compartilhar este post


Link para o post
Compartilhar em outros sites
 O lance de fazer apenas uma tabela e fazer o filtro não fica muito legal pois fica muito desorganizado.

é a mais organizada, independente dos níveis isso é uma coisa só no final.

é desorganizado ter a mesma coisa em vários lugares diferentes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

veja a dica do post #16.

 

 

Aprenda a criar seus campos com prefixo, para evitar uma dor de cabeça mais tarde, agora, por usar o nome dos campos iguais, será

 

preciso usar um ALIAS para mudar o nome dos campos na hora de exibir no script.

 

 

O correto seria você mudar a sua modelagem, mais em fim, vamos ver, não tenho como testar aqui, veja se funciona:

 

 

 

$foo = mysql_query("SELECT ativo.login,treinamento.login,pendente.login FROM ativo,treinamento,pendente WHERE ativo.login = '$login' OR treinamento.login='$login' OR pendente.login = '$login'")or die(mysql_error());


if(mysql_num_rows($foo) > 0)
{
 print 'Login existente'; ......
}


Leia: http://www.devmedia.com.br/introducao-ao-sql-pesquisa-em-multiplas-tabelas/17006

Compartilhar este post


Link para o post
Compartilhar em outros sites

veja a dica do post #16.

 

 

Aprenda a criar seus campos com prefixo, para evitar uma dor de cabeça mais tarde, agora, por usar o nome dos campos iguais, será

 

preciso usar um ALIAS para mudar o nome dos campos na hora de exibir no script.

 

 

O correto seria você mudar a sua modelagem, mais em fim, vamos ver, não tenho como testar aqui, veja se funciona:

 

 

 

$foo = mysql_query("SELECT ativo.login,treinamento.login,pendente.login FROM ativo,treinamento,pendente WHERE ativo.login = '$login' OR treinamento.login='$login' OR pendente.login = '$login'")or die(mysql_error());


if(mysql_num_rows($foo) > 0)
{
 print 'Login existente'; ......
}

 

Leia: http://www.devmedia.com.br/introducao-ao-sql-pesquisa-em-multiplas-tabelas/17006

Muito obrigado! Era exatamente isso que eu precisava!

 

Obrigado a todos que me ajudaram, aprendi mais um pouco.

 

E sobre a minha modelagem, vou tentar melhora-la. Mas é que estou apenas começando a programar então não tenho muita experiencia.

 

Abraçss

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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