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

(Resolvido) Dúvida em consulta com muitos campos


Himairo

Pergunta

Tenho um formulário com os seguintes campos para busca de um relatório:

txtTitulo, txtAutor, listaOrientador(é um campo select que recebe um idOrientador como valor), listaArea(é um campo select que recebe um idArea como valor), anoRelat, semestre, estagio

Esses valores são recebidos do formulário, sendo que basta apenas um para a consulta ser feita.

Tenho uma tabela Relatorio, Usuario, Orientador, Area...

A tabela Relatorio possui os campos: Usuario_idUsuario, titulo, Orientador_idOrientador, Area_idArea, ano....

A dúvida é, no MySql, como fazer no SELECT para eu poder pesquisar na tabela Relatório um registro com as características passadas e fazer a ligação para saber os nomes de Orientador e Area que constam nas suas tabelas. E fazer o inverso, caso seja selecionado orientador ou area fazer a ligação com o relatório.

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0
Tenho um formulário com os seguintes campos para busca de um relatório:

txtTitulo, txtAutor, listaOrientador(é um campo select que recebe um idOrientador como valor), listaArea(é um campo select que recebe um idArea como valor), anoRelat, semestre, estagio

Esses valores são recebidos do formulário, sendo que basta apenas um para a consulta ser feita.

Tenho uma tabela Relatorio, Usuario, Orientador, Area...

A tabela Relatorio possui os campos: Usuario_idUsuario, titulo, Orientador_idOrientador, Area_idArea, ano....

A dúvida é, no MySql, como fazer no SELECT para eu poder pesquisar na tabela Relatório um registro com as características passadas e fazer a ligação para saber os nomes de Orientador e Area que constam nas suas tabelas. E fazer o inverso, caso seja selecionado orientador ou area fazer a ligação com o relatório.

Oi, 'Himairo' !

Pode, por favor, reformular sua pergunta? Não está clara o suficiente para poder te ajudar.

Link para o comentário
Compartilhar em outros sites

  • 0

Reformulando....

Tenho uma consula que recebe pelo menos um desses campos: txtTitulo, txtAutor, listaOrientador(é um campo select que recebe um idOrientador como valor), listaArea(é um campo select que recebe um idArea como valor), anoRelat, semestre, estagio.

Todos esses valores estão na tabela Relatorio, só que nos campos listaOrientador e listaArea, caso selecionados, recebe o id das respectivas tabelas.

Quero fazer uma consulta que ignore os campos não selecionados, busca na tabela Relatorio e de acordo com os ids de Orientador e Area pegue os nomes nas suas tabelas.

E fazer o contrário, caso o usuário selecione,por exemplo, só Orientador ou Area busque na tabela Relatorio um registro que contenha uma dessas ids.

Espero que agora esteja claro. E aguardo ajuda.

Link para o comentário
Compartilhar em outros sites

  • 0
...

Quero fazer uma consulta que ignore os campos não selecionados, busca na tabela Relatorio e de acordo com os ids de Orientador e Area pegue os nomes nas suas tabelas.

E fazer o contrário, caso o usuário selecione,por exemplo, só Orientador ou Area busque na tabela Relatorio um registro que contenha uma dessas ids.

Espero que agora esteja claro. E aguardo ajuda.

Oi, Himario! Esta custará dobrado, pois são duas consultas (eheheh)

Vamos lá:

Primeira consulta

Quero fazer uma consulta que ignore os campos não selecionados, busca na tabela Relatorio e de acordo com os ids de Orientador e Area pegue os nomes nas suas tabelas.

SELECT r.titulo, r.autor, lo.nome, la.nome u.nome 
FROM relatorio r
INNER JOIN listaOrientador lo ON r.idOrientador = lo.idOrientador
INNER JOIN listaArea la ON r.idArea = la.idArea
WHERE r.titulo = txtTitulo OR r.Autor = txtAutor OR r.listaOrientador = valor1 OR r.idArea = valor2 OR .....
Segunda consulta
E fazer o contrário, caso o usuário selecione,por exemplo, só Orientador ou Area busque na tabela Relatorio um registro que contenha uma dessas ids.
SELECT r.titulo, r.autor, lo.nome, la.nome u.nome 
FROM relatorio r
INNER JOIN listaOrientador lo ON r.idOrientador = lo.idOrientador
INNER JOIN listaArea la ON r.idArea = la.idArea
WHERE la.idArea = Valor1 OR lo.idOrientador = valor2

Atenção: os valores dados devem ser substituídos conforme a linguagem de programação que você usa.

O último OR da consulta 1 deve ser retirado ou acrescido de uma condição. e para cada consdição que você deseja é só acrescentar um OR entre cada uma.

Link para o comentário
Compartilhar em outros sites

  • 0
Olá Denis! Fiz como você sugeriu, mas não deu certo. Funcionou apenas a parte da impressão dos resultados onde conseguiu-se pegar os valores "nomes" das outras tabelas.

Mas a busca não foi bem sucessida, está retornando todos os relatórios cadastrados independente do valor e campo que eu preencho/seleciono.

Veja como eu fiz:

if( ($titulo=="") && ($autor=="") && ($ano=="") && ($semestre=="") && ($tipoEstagio==""))
  {
   if( ($orientador!=-1) || ($area!=-1))
   {

     $resultado = ("SELECT r.idRelatorio, r.titulo, r.ano, r.semestre, r.tipoEstagio, o.nomeOrientador, a.nomeArea, u.nomeUsuario
           FROM relatorio r
           INNER JOIN orientador o ON (r.Orientador_idOrientador = o.idOrientador)
           INNER JOIN area a ON (r.Area_idArea = a.idArea)
           INNER JOIN usuario u ON (r.Usuario_idUsuario = u.idUsuario)
           WHERE o.idOrientador LIKE '%{$orientador}%' OR a.idArea LIKE '%{$area}%' ORDER BY idRelatorio ") or die("ERRO NO COMANDO SQL");
     }
     }
      else
      {
      $resultado = ("SELECT r.idRelatorio, r.titulo, r.ano, r.semestre, r.tipoEstagio, o.nomeOrientador, a.nomeArea, u.nomeUsuario
           FROM relatorio r
           INNER JOIN orientador o ON (r.Orientador_idOrientador = o.idOrientador)
           INNER JOIN area a ON (r.Area_idArea = a.idArea)
           INNER JOIN usuario u ON (r.Usuario_idUsuario = u.idUsuario)
           WHERE r.titulo LIKE '%{$titulo}%' OR u.nomeUsuario LIKE '%{$autor}%' OR o.idOrientador LIKE '%{$orientador}%' OR a.idArea LIKE '%{$area}%' OR r.ano LIKE '%{$ano}%' OR r.semestre = '$semestre' OR r.tipoEstagio = '$tipoEstagio' ORDER BY idRelatorio ") or die("ERRO NO COMANDO SQL");
      }

Coloquei os ifs para caso o usuário selecione apenas uma área ou um orientador. O que devo fazer??

Link para o comentário
Compartilhar em outros sites

  • 0

Oi, 'Himairo'!

Creio que você está usando o PHP como Linguagem de desenvolvimento para sua aplicação. Não conheço o PHP , mas a sintaxe é minha velha conhecida "C e C++". Então fiz uma pequena modificação no seu código e espero que você possa adaptá-la a sua necessidade.

Creio que desta vez vá funcionar, pois só pegará os campos que estiverem preenchidos.

Outra Coisa. Na sintaxe do MySQL evite usar parenteses na cláusula ON do JOIN. Evite, também, o uso de "%" a esquerda da cláusula LIKE, pois isto causa uma pesquisa em TABLE SCAN que é a varredura de registro a registro nas suas tabelas para satisfazer a necessidade da pesquisa. (Ele ignora os índices e pesquisa seqüencialmente). O que causa uma lentidão exponencial a quantidade de tabelas que estiverem ligadas.

O código Ficou assim:

$resultado = "SELECT r.idRelatorio, r.titulo, r.ano, r.semestre, r.tipoEstagio, o.nomeOrientador, a.nomeArea, u.nomeUsuario
FROM relatorio r
INNER JOIN orientador o ON r.Orientador_idOrientador = o.idOrientador
INNER JOIN area a ON r.Area_idArea = a.idArea
INNER JOIN usuario u ON r.Usuario_idUsuario = u.idUsuario
WHERE " 

$Filtro = ""
if ($orientador!=-1)
   $Filtro = $Filtro." o.idOrientador LIKE '{$orientador}%'"
if ($Filtro != "")
   $Filtro = $Filtro. " OR "
if ($area!=-1)
   $Filtro = $Filtro." a.idArea LIKE '{$area}%'"
if ($Filtro != "")
   $Filtro = $Filtro. " OR "
if $titulo!=""
   $Filtro = $Filtro." r.titulo LIKE '{$titulo}%'"
if ($Filtro != "")
   $Filtro = $Filtro. " OR "
if ($autor!="")
   $Filtro = $Filtro." u.nomeUsuario LIKE '{$autor}%'"
if ($Filtro != "")
   $Filtro = $Filtro. " OR "
if ($ano!="")
   $Filtro = $Filtro." r.ano LIKE '{$ano}%'"
if ($Filtro != "")
   $Filtro = $Filtro. " OR "
if ($semestre!="")
   $Filtro = $Filtro." r.semestre = '$semestre'"
if ($Filtro != "")
   $Filtro = $Filtro. " OR "
if ($tipoEstagio=="") 
   $Filtro = $Filtro." r.tipoEstagio = '$tipoEstagio'"
$resultado = $resultado.$Filtro. " ORDER BY idRelatorio "

P.S.: não sei se está correto, mas usei o ponto como caracter de concatenação entre as strings.

Informe se obteve sucesso ou se necessita outros ajustes.

Link para o comentário
Compartilhar em outros sites

  • 0

Oi Denis! Parace que desta vez está funcionando!!

MUITO OBRIGADO!!!!! :D

$resultado = ("SELECT DISTINCT r.idRelatorio, r.titulo, r.ano, r.semestre, r.tipoEstagio, o.nomeOrientador, a.nomeArea, u.nomeUsuario
           FROM relatorio r
           INNER JOIN orientador o ON (r.Orientador_idOrientador = o.idOrientador)
           INNER JOIN area a ON (r.Area_idArea = a.idArea)
           INNER JOIN usuario u ON (r.Usuario_idUsuario = u.idUsuario)
           ");
$Filtro = "";
if ($orientador!="")
{
   $Filtro = $Filtro."o.idOrientador LIKE '{$orientador}%'";
   }

if ($area!="" )
{
   if ($Filtro != "")
   {
   $Filtro = $Filtro. " OR ";
   }

   $Filtro = $Filtro." a.idArea LIKE '{$area}%'" ;
   }

if ($titulo!="")
{
   if ($Filtro != "")
   {
   $Filtro = $Filtro. " OR ";
   }

   $Filtro = $Filtro." r.titulo LIKE '%{$titulo}%'";
   }


if ($autor!="")
{
   if ($Filtro != "")
   {
   $Filtro = $Filtro. " OR ";
   }

   $Filtro = $Filtro." u.nomeUsuario LIKE '%{$autor}%'";

   }

if ($ano!="")
{
   if ($Filtro != "")
   {
   $Filtro = $Filtro. " OR ";
   }

   $Filtro = $Filtro." r.ano LIKE '%{$ano}%'";

   }


if ($semestre!="")
{
   if ($Filtro != "")
   {
   $Filtro = $Filtro. " OR ";
   }

   $Filtro = $Filtro." r.semestre = '$semestre'";

   }

if ($tipoEstagio!="")
{
   if ($Filtro != "")
   {
   $Filtro = $Filtro. " OR ";
   }

   $Filtro = $Filtro." r.tipoEstagio = '$tipoEstagio'";

   }
$resultado .= 'WHERE '.$Filtro.' ORDER BY idRelatorio';

Tive que usar "%" a esquerda na cláusula LIKE em título,autor e ano pois ão estava retornando as ocorrências das palavras no registrp todo.

Mais uma vez muito obrigado!! Qualquer alteração no resultado volto aqui viu?!

valeu! Abraço! ;)

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

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