Ir para conteúdo

POWERED BY:

Arquivado

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

Paulo Freitas Nobrega

consulta com varias opções de um mesmo campo

Recommended Posts

Olá pessoal é o seguinte:

 

tenho um select:

<select name="editoria" class="admin_select"><option value="0"> :EDITORIA:  </option><option value="1"> Administração </option><option value="2"> Ambiente </option><option value="3"> Comunicação </option><option value="4"> Economia </option><option value="5"> Educação </option><option value="6"> Esportes </option><option value="7"> Fique Sabendo </option><option value="8"> Geral </option><option value="9"> Grandes Lagos </option><option value="10"> Jornal da Ilha </option><option value="11"> Nepotismo </option><option value="12"> Política </option><option value="13"> Saúde </option><option value="14"> TODAS  </option></select>

e as condições em php:

<?php if ($editoria == 1) $editorias = "Administração";if ($editoria == 2) $editorias = "Ambiente";if ($editoria == 3) $editorias = "Comunicação";if ($editoria == 4) $editorias = "Economia";if ($editoria == 5) $editorias = "Educação";if ($editoria == 6) $editorias = "Esportes";if ($editoria == 7) $editorias = "Fique Sabendo";if ($editoria == 8) $editorias = "Geral";if ($editoria == 9) $editorias = "Grandes Lagos";if ($editoria == 10) $editorias = "Jornal da Ilha";if ($editoria == 11) $editorias = "Nepotismo";if ($editoria == 12) $editorias = "Política";if ($editoria == 13) $editorias = "Saúde";if ($editoria == 14) $editorias = "Administração, Ambiente, Comunicação, Economia, Educação, Esportes, Fique Sabendo, Geral, Grandes Lagos, Jornal da Ilha, Nepotismo, Política, Saúde";?>

e a pesquisa:

$sql_nova = "SELECT * FROM blog_notas WHERE titulo LIKE '%$busca%' AND editoria = '$editorias' ORDER BY 'id' DESC";

o problema é: eu posso selecionar no select qualquer editoria entre a "Administração" e "Saúde" que a pesquisa da certo mas quando escolho a opção de value 14 no select a consulta da errado. Creio por causa que a opção 14 tem em seu conteudo todas as outras opção, digo "Administração, Ambiente, ......".

 

Queria eu saber então se tem como eu fazer a seguinte pesquisa, se é um erro de código ou não tem como fazer tal pesquisa desta forma, se haver qualquer outra forma também ajuda...

 

Valew..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá,

Você pode utilizar o FIND_IN_SET, que é uma função do mysql que retorna a posição de um texto dentro de uma lista de itens separados por vírgula.

Ex:

SELECT *

FROM teste

WHERE FIND_IN_SET(conteudo,'Administração,Ambiente,Comunicação,Economia,Educação,Esportes,Fique Sabendo,Geral,Grandes Lagos,Jornal da Ilha,Nepotismo,Política,Saúde') > 0

Observe que o texto que contém os itens é concatenado com apostrofo ('), e não há espaço entre um item e outro, se estiver com espaço a busca não será realizada corretamente.

Esta função retorna um número, então no seu caso, seria interessante saber se a posição é maior que zero (0).

Não sei bulufas de php, mas deve ficar algo do tipo:

retirar os espaços entre os itens

if ($editoria == 14) $editorias = "Administração,Ambiente,Comunicação,Economia,Educação,Esportes,Fique Sabendo,Geral,Grandes Lagos,Jornal da Ilha,Nepotismo,Política,Saúde";

atualizar a consulta:

$sql_nova = "SELECT * FROM blog_notas WHERE titulo LIKE '%$busca%' AND FIND_IN_SET(editoria,'$editorias') > 0 ORDER BY 'id' DESC";

As demais consultas que possuem somente 1 continuarão a funcionar normalmente.

Fonte: String Functions (MySQL)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Perfeito cassitos, caiu como uma luva...Mas agora me sergiu um novo desafiu, é o seguinte:Temos:

$sql_nova = "SELECT * FROM blog_notas WHERE titulo LIKE '%$busca%' AND FIND_IN_SET(editoria,'$editorias') > 0 ORDER BY 'id' DESC";

a consulta faz uma busca com a paralavra indicada pelo usuário no campo "TITULO" e na editoria também escolhida por ele. Certo?Mas além do campo título, também possui informações de interesse do usuário os campo 'chapeu' e 'texto', então fiz um novo select:
<select name="local" class="admin_select"><option value="0"> :LOCAL:  </option><option value="1"> Título </option><option value="2"> Chapeu </option><option value="3"> Texto </option>								</select>
e também as códições php:
if ($local == 1) $localn = "titulo";if ($local == 2) $localn = "chapeu";if ($local == 3) $localn = "texto";
Agora gostaria de saber, se a como, usando esse exemplo que você me mostrou, colocar nesse select a opção "TODAS"; tentei seguir seu exemplo, mas o problema é que antes o FIND_IN_SET estava apenas em um campo "editoria" mas agora quero que ele procure nos três campo "titulo, chapeu e texto". Tem como fazer isso?Ahhhh, antes que eu esqueça, com a adição deste novo select minha sql ficou assim:

$sql_nova = "SELECT * FROM blog_notas WHERE $localn LIKE '%$busca%' AND FIND_IN_SET(editoria,'$editorias') > 0 ORDER BY 'id' DESC";

Compartilhar este post


Link para o post
Compartilhar em outros sites

hum...

para utilizar a opção todas ou vários campos para o "busca", neste caso, seria útil agrupar estes campos com OR, criando apenas uma expressão independente das demais condições, algo do tipo:

se consultar por opção "todas" por exemplo

"SELECT * FROM blog_notas WHERE (titulo LIKE '%$busca%' OR chapeu LIKE '%$busca%' OR texto LIKE '%$busca%') AND FIND_IN_SET(editoria,'$editorias') > 0 ORDER BY 'id' DESC";

Nesta consulta está buscando onde o texto a ser pesquisado $busca contém em algum dos 3 campos relacionados e depois ele verifica se a editora está de acordo com o consultado.

P/ montar todos estes OR's você deve utilizar o php neste caso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

P/ montar todos estes OR's você deve utilizar o php neste caso.

Desculpe cassitos, mas não consegui entender essa parte....porque é o seguinte, temos:
$sql_nova = "SELECT * FROM blog_notas WHERE $localn LIKE '%$busca%' AND FIND_IN_SET(editoria,'$editorias') > 0 ORDER BY 'id' DESC";
isso quer dizer se o usuário escolher 'local = chapeu' a variavel $localn vai ter o valor chapeu e a consulta ficaria:
$sql_nova = "SELECT * FROM blog_notas WHERE chapeu LIKE '%$busca%' AND FIND_IN_SET(editoria,'$editorias') > 0 ORDER BY 'id' DESC";
com a sua sugestão ficaria:
"SELECT * FROM blog_notas WHERE (titulo LIKE '%$busca%' OR chapeu LIKE '%$busca%' OR texto LIKE '%$busca%') AND FIND_IN_SET(editoria,'$editorias') > 0 ORDER BY 'id' DESC";
mas e si o usuário escolhar supondo 'local = texto'; a consulta também serviria, ou ela apenas da certo se ele escolher 'local = todas'?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opá meu amigo cassitos, não sei se era isso que você estava pensando mas consegui resolver de uma maneira, vou postala aqui no forum pois se alguém tiver a mesma dúvida a solução vai estar ai!

 

a sql ficou assim:

$sql_nova = "SELECT * FROM blog_notas WHERE $localn AND FIND_IN_SET(editoria,'$editorias') > 0 ORDER BY 'id' DESC";

dai usei o if para ajudar, então as condições ficaram assim:

if ($local == 1) $localn = "(titulo LIKE '%$busca%')";if ($local == 2) $localn = "(chapeu LIKE '%$busca%')";if ($local == 3) $localn = "(texto LIKE '%$busca%')";if ($local == 4) $localn = "(titulo LIKE '%$busca%' OR chapeu LIKE '%$busca%' OR texto LIKE '%$busca%')";

Valuew pela ajuda!

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.