Ir para conteúdo

Arquivado

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

Roberto P S Jr

Mysql Prioridade And (Or...or...or...or)

Recommended Posts

Bom dia caros leitores!

 

Preciso entender o que acontece com minha query, eu estou buscando em uma tabela só a quantidade de registros que contem determinadas palavras usando o Like em um campo Obs do tipo Varchar em um periodo especifico de tempo usando o Between em um campo do tipo date.

Sim retorna resultados sem erros, mas na verdade os resultados não condiz com a query, pois não traz o que eu quero... é como se os OR fossem ignorados.... Muito estranho...

 

Select

usuario,
codigo,
FONTE,
RESULT,
data,
tip_recl,
tip_info,
Obs,
dh_control
from controlelr
where
date(DH_CONTROL) BETWEEN '2013/12/01' AND '2013/12/31'
And
( Obs like '%NAO CONCORDA%'
or Obs like '%DISCORDA%'
or Obs Like '%MAU%'
or Obs Like '%MAL%'
or Obs Like '%XINGOU%'
or Obs Like '%CHINGOU%'
or Obs Like '%NEGATIVO%'
or Obs Like '%NAO ACEITA%'
or Obs Like '%CONTRA%'
)
Também tentei dessa forma:
select
usuario,
codigo,
FONTE,
RESULT,
data,
tip_recl,
tip_info,
Obs,
dh_control
from controlelr
where
Data BETWEEN '2013/12/01' AND '2013/12/31'
And
Obs like '%NAO CONCORDA%'
or Obs like '%DISCORDA%'
or Obs Like '%MAU%'
or Obs Like '%MAL%'
or Obs Like '%XINGOU%'
or Obs Like '%CHINGOU%'
or Obs Like '%NEGATIVO%'
or Obs Like '%NAO ACEITA%'
or Obs Like '%CONTRA%'
O que eu estou fazendo de errado ?

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

a 1ª parece correta, testou só com a condição da data ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou com o mesmo problema, preciso fazer uma consulta com 2 variáveis e não roda,

Preciso consultar um intervalo de data + o status do cliente

Se eu coloco assim ele funciona direitinho:

$sql = "SELECT * FROM tb_cartao WHERE data BETWEEN '$data1' AND '$data2' ORDER BY nome ASC";

 

mas quando tento colocar o status assim, ele não roda:

$sql = "SELECT * FROM tb_cartao WHERE data BETWEEN '$data1' AND '$data2' and status = $status and bandeira = $bandeira ORDER BY nome ASC";

 

Alguém consegue me dar um help

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nao conheco esta sintaxe mas qual o criterio para as aspas nos parametros do sql?

Compartilhar este post


Link para o post
Compartilhar em outros sites

poste o(s) erro(s) apresentado(s);

- evite a palavra "data";

- use parênteses para definir melhor esses "and" (pesquise sobre precedência de operadores);

- em variáveis do tipo texto (string) tente coloca-las entre aspas simples;

- procure tb dar "echos" nas variaveis (pesquise tb sobre var_dump) se os problemas persistirem ou retorne.

 

Estou com o mesmo problema

 

se não estou enganado, o problema do post original é diferente do seu;

observe que a pesquisa do post #1 utiliza "like" (termos aproximados)

e vc está usando operador = (igual)

Compartilhar este post


Link para o post
Compartilhar em outros sites

vc poderia dar um echo nessas queries pra que possamos ver exatamente como elas estao? se aquele bandeira for string n vai rodar mesmo, mas posta o echo das queries se for possivel

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, desculpem voltar com o assunto meses depois mas eu venho pesquisando muito sobre isso e até agora não consegui resolver e conto com a ajuda de vocês.

 

Meu problema é o mesmo do Roberto P S Jr. Mas eu já tentei utilizar as regras de precedência de operadores colocando os parenteses na condição que quero dar prioridade e não adianta nada. Também já troquei aquele monte de LIKE e OR pelo RLIKE (ou REGEXP) e dá no mesmo. Vou explicar meu caso abaixo.

 

Consulta atual:

SELECT licativ.*, lic.*
FROM selic_licitacao lic, selic_licitacao_atividade licativ
WHERE (lic.str_objeto RLIKE 'Adesivagem|Arte|Arte Finalização|Banner|Bloco')
AND licativ.str_codigo = 's035'
AND licativ.str_estado = 'ES'
AND lic.dt_cadastro BETWEEN DATE_SUB(curdate(), INTERVAL 1 DAY) AND CURDATE()
AND lic.num_licitacao = licativ.num_licitacao;

Objetivo: Pegar todos os itens que contenham as palavras "Adesivagem" ou "Arte" ou "Arte Finalização" ou "Banner" ou "Bloco" que possuam o código "s035", sejam do estado "ES" e tenham data de cadastro entre hoje e ontem.

 

Acontece que, se ele achar qualquer item que atenda a condição "código = s035" e "estado = ES" a consulta tá ignorando o fato de ter que possuir aquelas palavras.

 

Abaixo a imagem com o resultado da consulta:

 

precedencia_mysql.png

 

 

Vejam que no campo "str_objeto" não possuímos nenhuma das palavras "Adesivagem" ou "Arte" ou "Arte Finalização" ou "Banner" ou "Bloco".

 

Alguém tem alguma ideia de como resolver?

Compartilhar este post


Link para o post
Compartilhar em outros sites

http://dev.mysql.com/doc/refman/5.0/en/regexp.html#operator_regexp

 

 

Creio que a síntaxe está errada.

 

Tentou algo como

 

And ( campo1 like '%adesivo%' or campo1 like '%arte%' or ...)

 

Motta obrigado pelo retorno. Na própria documentação que você em enviou têm:

 

 

de|abc

Match either of the sequences de or abc.

 

 

 

For example, the regular expression hello|word matches either the stringhello or the string word.

 

Acredito que a expressão com o REGEXP não esteja errada.

Também já tentei com o LIKE (usando os parenteses também) mas acontece o mesmo, é retornado o mesmo resultado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não trabalho com MySql realmente apenas indiquei a documentação.

 

Talvez assim

 

  •  

  • (abc)*

    Match zero or more instances of the sequence abc.

    mysql> SELECT 'pi' REGEXP '^(pi)*
  •  

; -> 1
mysql> SELECT 'pip' REGEXP '^(pi)*
  •  

  • ; -> 0
    mysql> SELECT 'pipi' REGEXP '^(pi)*
    •  

    • ; -> 1

    •  

 

    •  

Compartilhar este post


Link para o post
Compartilhar em outros sites

Descobri que não há problema algum, nem com o LIKE nem com o RLIKE (ou REGEXP).

 

Veja a imagem de novo:

precedencia_mysql.png

 

Os objetos possuem sim os textos que estou procurando.

Ex.: "Fornecimento de Materiais de armarinho, Artesanato, Papelaria, etc."

 

Se procurei por "Arte", "Artesanato" tem essa expressão. Então está correto.

O que está errado são as palavras que estou usando para pesquisar. Não que estejam "erradas" mas devem ser muito bem pensadas na hora da busca.

 

Motta, obrigado 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.