Ir para conteúdo

POWERED BY:

Arquivado

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

::Porto

Busca com operador lógico OR.

Recommended Posts

Pessoal, criei uma busca no banco de dados através de um formulário.

Vamos supor que a TABELA contenha os seguintes campos:

nome-------|---sobrenome

------------- | ---------------

Ronaldinho-|---Gaucho

Gilberto-----|---Silva

Raul---------|---Seixas

Maria Rita---|---Silva

A instrução utilizada para consulta foi esta:

$consulta = "SELECT * FROM tabela WHERE (nome LIKE '%$busca%') OR (sobrenome LIKE '%$busca%')";

onde a variável $busca refere-se ao name="busca" type="text" do form.

 

A busca está funcionando da seguinte forma:

1a) Situação:

I) Se o usuário digita por Ronaldinho a busca funciona perfeitamente;

II) Se o usuário digita por Gaucho a busca funciona perfeitamente;

III) Agora se o usuário digita por Ronaldinho Gaucho a busca não está encontrando nada.

 

2a) Situação:

I) Se o usuário digita por Maria Rita a busca funciona perfeitamente;

II) Agora se o usuário digita invertido por Rita Maria a busca não está encontrando nada.

 

Conto com a ajuda de vocês para a solução do problema. Agradeço desde já a colaboração de todos.

 

Abraços. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

O "erro" três da primeira situação está correto, você não tem ninguem igual " Ronaldinho Gaucho", ou você tem "Ronaldinho" ou você tem "Gaucho". O mesmo vale para o item II da segunda situação.

 

E se o cara tiver três ou quatro nomes ?

 

Talvez fosse interessante você "dividir" tua variável $busca, jogar em um array, daí usar o IN para fazer a busca dentro deste array.

 

Se você digitar "Maria Rita", teu array vai ficar com dois itens, "Maria" e "Rita", faz um loop para montar o IN, daí tua consulta ficaria assim.

 

SELECT * FROM tabela WHERE nome IN ('$busca[0]','$busca[1]')OR sobrenome IN ('$busca[0]','$busca[1]')

Isso para o exemplo acima ficaria assim:

SELECT * FROM tabela WHERE nome IN ('Maria','Rita')OR sobrenome IN ('Maria','Rita')

Pensa aí... qualquer coisa manda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Walace! Primeiramente, obrigado pela cooperação na solução do meu problema. Bom, transformei a minha variável de $busca em array, quebrei cada palavra do array e fiz o looping para inserir na variável que contém o SELECT. No entanto, me compliquei na hora de inserir o resultado do looping na variável SELECT. Tentei concatenando, criando uma nova função, .... enfim, não obtive exito neste procedimento.

 

Daí, pra conferir, resolvi fazer aquele "TIRA-TEIMA" sobre a sua solução, utilizando IN no select... incorporando exatamente como no exemplo da Maria Rita abaixo:

 

SELECT * FROM tabela WHERE nome IN ('Maria','Rita') OR sobrenome IN ('Maria','Rita')
Desta forma, não encontrei nenhum resultado. Daí, realizando outros testes, constatei que só obteria resultado satisfatório se escrevesse o nome exatamente como se encontra no CAMPO da tabela, que no caso seria 'Maria Rita'.... ou seja, o IN não considerou a quebra da busca em 'Maria' e 'Rita'.

 

Com isso, depois de sofrer entre tentativas e erros, encontrei uma forma de fazer o processo bem "feia"... porém funcional... que seria gerando um loop com um resultado enorme desta forma:

 

SELECT * FROM tabela WHERE nome LIKE ('%$busca[0]%') OR sobrenome LIKE ('%$busca[0]%') OR ...  OR nome LIKE ('%$busca[n]%') OR sobrenome LIKE ('%$busca[n]%')
Agora, o meu problema tá em incorporar o resultado do loop no SELECT e peço ajuda. O código que criei foi este:

 

/* varbusca recebe a variavel $buscar do formulário */$varbusca = "$buscar";$divisao = " ";$busca = split($divisao, $varbusca);$elementos = count($busca);$i=1;if ($elementos>0){	echo " nome LIKE ('%$busca[0]%') OR sobrenome LIKE ('%$busca[0]%')";		while ($i<$elementos){			  echo " OR nome LIKE ('%$busca[$i]%') OR sobrenome LIKE ('%$busca[$i]%')";			  ++$i;		}}
Agradeço antecipadamente,

Um abraço. :wacko:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Testei teu codigo e aparentemente deve estar correto.

 

Copiei isso:

echo "SELECT * FROM tabela WHERE ";$varbusca = "Maria Rita";$divisao = " ";$busca = split($divisao, $varbusca);$elementos = count($busca);$i=1;if ($elementos>0){	echo " nome LIKE ('%$busca[0]%') OR sobrenome LIKE ('%$busca[0]%')";		while ($i<$elementos){			  echo " OR nome LIKE ('%$busca[$i]%') OR sobrenome LIKE ('%$busca[$i]%')";			  ++$i;		}}

E o resultado foi este:

SELECT * FROM tabela WHERE nome LIKE ('%Maria%') OR sobrenome LIKE ('%Maria%') OR nome LIKE ('%Rita%') OR sobrenome LIKE ('%Rita%')

Não está certo ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O resultado que quero é este mesmo... mas estou me complicando pra armazenar todo este código que gera o SELECT dentro de uma variavel. Que faça isso no select da Maria Rita:

$VARIAVEL = "SELECT * FROM tabela WHERE nome LIKE ('%Maria%') OR sobrenome LIKE ('%Maria%') OR nome LIKE ('%Rita%') OR sobrenome LIKE ('%Rita%')";

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que entendi, então faz o seguinte:

(potz, tá virando mais php do que mysql, mas tudo bem, vamos lá...) http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

$query = "SELECT * FROM tabela WHERE ";$varbusca = "Maria Rita";$divisao = " ";$busca = split($divisao, $varbusca);$elementos = count($busca);$i=1;if ($elementos>0){	$query.=" nome LIKE ('%$busca[0]%') OR sobrenome LIKE ('%$busca[0]%')";		while ($i<$elementos){			  $query.=" OR nome LIKE ('%$busca[$i]%') OR sobrenome LIKE ('%$busca[$i]%')";			  ++$i;		}}echo $query;

Vê o conteúdo de query no final, deve ser isso que você quer.

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.