Ir para conteúdo
Fórum Script Brasil
  • 0

Busca em várias tabelas (Resolvido)


MTavares

Pergunta

Olá colegas.

Estou eu aqui com mais um desafio... tenho uma busca interna com várias palavas-chave. Ex:

Nome, Idade, Cidade, Estado, Nº CPF, Identidade, Escolaridade.

Essas palavras- chave encontram-se em tabelas diferentes. Vejam:

Nome, Idade, cidade e estado => tabela dados pessoais

Nº CPF e Identidade => tabela dados documentos

Escolaridade => tabela cursos

Quero varrer essas tabelas e trazer os resultados. Pensei em usar o UNION, mas não serve, pois esse operador serve caso os campos sejam iguais nas tabelas, e não é isso que ocorre, pensei em usar o INNER JOIN (LEFT, ETC), mas ele serve para unir os resultados baseados no relacionamento de chave primária com estrangeira... Alguém teria uma idéia de como eu poderia fazer essa busca?

Caso eu esteja errado no meu racionício acima, por favor, em corrigam....

Obrigado.

Editado por MTavares
Link para o comentário
Compartilhar em outros sites

11 respostass a esta questão

Posts Recomendados

  • 0

Olá Willian.

Obrigado pela dica e confesso-lhe que não conheço full text search, mas diante das minhas pesquisas, acredito que irei esbarrar no mesmo problema do UNION, ou seja, é necessário os campos usados nas buscas terem os mesmos nomes nas tabelas, correto?

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Eu pensei em usar o modo , digamos, "tradicional". Ex:

SELECT * FROM tabela1, tabela2, tabela2 WHERE tabela1.campotabela1 = 'texto1' OR tabela2.campotabela2 = 'texto2' OR tabela3.campotabela3 = 'texto3'

... mas não sei se esse seria a forma mais "elegante" de fazer essa busca.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Olá dinohills,

na verdade as tabelas estão usando chaves estrangeiras. Por ex:

Nome, Idade, cidade e estado => tabela dados pessoais (é a tabela com a chave primária)

Nº CPF e Identidade => tabela dados documentos (contém a chave estrangeira baseado na tabela acima)

Escolaridade => tabela cursos (contém a chave estrangeira baseado na primeira tabela)

Porém na busca, não tenho exatamente como pegar a chave primária, pois é uma busca generalizada, ou seja, o administrador irá fazer a busca em cima nome ou idade ou cidade ou estado, e assim por diante. Se buscar somente pelo nome, aí sim, teria como eu filtrar pela chave primária / estrangeira, mas se ele fizer uma busca generalizada. Ex:

De 20 até 30 anos, que more em SP e que tenha o 2º grau completo

aí já não tenho mais como usar a chave primária, já que irá envolver outros cadastros.

O desafio está exatamente aí, varrer as três tabelas e trazer os resultados. Até estou pensando em dar uma query separada. Ex:

$sqlTB1 = query da primeira tabela;
$contarTB1 = mysql_num_rows($sqlTB1);

$sqlTB2 = query da primeira tabela;
$contarTB2 = mysql_num_rows($sqlTB2);

$sqlTB3 = query da primeira tabela;
$contarTB3 = mysql_num_rows($sqlTB3);

if($contarTB1 == 0 AND $contarTB2 == 0 AND $contarTB3 == 0):
   echo "Nenhum registro encontrado";
else:
// Vamos fazer a busca
endif;

Acho que dessa forma até funcione, porém se eu pudesse usar somente uma query, seria ótimo.

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Olá dinohills.

Desculpe na demora da resposta, infelizmente não posso armazenar as informações em uma só tabela devido a estrutura do sistema. Cada tabela contém vários campos. A busca que preciso fazer, é de apenas alguns campos dessas tabelas. Se eu unificar as tabelas, além da tabela ficar enorme, terei que mexer na estrutura do sistema, já que faço referência dessas tabelas em várias partes do projeto e o prazo está um pouco apertado para fazer isso. ;)

Tentei usar o modo tradicional citado anteriormente, porém mesmo selecionando apenas uma opção, ele me retorna todos os resultados, até mesmo os que não selecionei.

SELECT * FROM tabela1, tabela2, tabela2 WHERE tabela1.campotabela1 = 'texto1' OR tabela2.campotabela2 = 'texto2' OR tabela3.campotabela3 = 'texto3'

Acredito que seja por causa do "OR", mas se eu colocar "AND", poderá dar problemas, já que se ao menos um campo for verdadeiro, o resultado poderá me retornar falso.

Estou pensando em construir essa query no PHP, só que ainda vejo obstáculos nesse raciocínio....

Abraços

Link para o comentário
Compartilhar em outros sites

  • 0

Uma solução plausível foi colocar em PHP mesmo. Vejam uma forma resumida (sem JOIN, mas no modo "tradicional"):

$buscar = "SELECT * FROM tabela1, tabela2, tabela2 WHERE ";

if(!empty($_POST["CampoA"])){
  $buscar .= "campoA.tabela1 = ".$_POST["CampoA"].  " OR ";
}
if(!empty($_POST["CampoB"])){
  $buscar .= "campoA.tabela2 = ".$_POST["CampoB"].  " OR ";
}
if(!empty($_POST["CampoC"])){
  $buscar .= "campoA.tabela3 = ".$_POST["CampoC"];
}
$buscar .= " GROUP BY campoA.tabela1 = ".$_POST["CampoA"];

$query = mysql_query($buscar);

.....

O problema agora está o "OR", pois se o usuário selecionar por ex apenas o campoA, o "OR" aparecerá e dará um erro. O ex. está constando apenas 03 campos, mas no sistema terão mais campos na busca. Alguém teria uma solução para isso?

Obrigado!

Abraços

Editado por MTavares
Link para o comentário
Compartilhar em outros sites

  • 0

Pessoal, consegui resolver.... como aqui é uma troca de experiências, segue abaixo a solução:

if(!empty($_POST["CampoA"])){
  $buscar[] .= "campoA.tabela1 = ".$_POST["CampoA"].  " ";
}
if(!empty($_POST["CampoB"])){
  $buscar[] .= "campoA.tabela2 = ".$_POST["CampoB"].  "  ";
}
if(!empty($_POST["CampoC"])){
  $buscar[] .= "campoA.tabela3 = ".$_POST["CampoC"];
}
$query = mysql_query("SELECT * FROM tabela1, tabela2, tabela2 WHERE " .implode(" OR ",$buscar). " GROUP BY campoA.tabela1");

Abraços

Editado por MTavares
Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...