+7

Consultas complexas utilizando processamento condicional no MySql.

criado por Emanuel Fonseca em 18/12/2003 10:33am
Tudo bem conseguimos construir nossa cláusula e agora precisamos filtrar os resultados obtidos. Normalmente utilizaríamos o nosso costumeiro where, porém existem restrições quanto sua utilização neste tipo de consulta. Pois bem, nossa saída então foi encontrar uma outra forma conforme descrevo abaixo.

from clientes having presente = '0' or futuro = '2'

Utilizamos a cláusula having, que para casos específicos (if, case e group by) substitui o where.

Acredito que a grande maioria tenha entendido esse artigo, porém para aqueles que ainda sentem dificuldades irei grafar um exemplo mais direto.

Dado:

Dia atual = 16;
Mês atual = 12;
Ano atual = 2003;

SELECT *,IF(expiraano = '2003' and expirames >= '12' and expiradia >= '16', 0, 1) as presente, IF(expiraano > '2003’, 2,3) as futuro from clientes having presente = '0' or futuro = '2'

Na nossa primeira condicional, lê-se:

Se o campo expiraano for igual ao ano atual e o campo expirames for maior ou igual ao mês atual e o campo expiradia for maior ou igual ao dia atual este campo terá “0” como valor, caso contrário terá “1” como valor.

Na nossa segunda lê – se:

Se o campo expiraano for maior que o ano atual este campo terá “2” como valor, caso contrário terá “3” como valor.

Seguindo o que foi proposto, o campo presente terá valores “0” e valores “1” e o campo futuro terão valores “2” e valores “3”. Se vocês observaram, logo notaram que utilizamos or e não and quando filtramos os dados. Mas pq? Notem que se utilizarmos o and, a select retornará 0 resultados, pois uma consulta depende da outra pq a segunda depende dos resultados que retornarem false da primeira.

Espero que este artigo tenha serventia para vocês e que os ajudem a solucionar problemas semelhantes a este.

[]'s
Emanuel Fonseca

Comentários:

Mostrando 1 - 10 de 21 comentários
Eric disse:
Interessante...
Esse é o problema quando pegamos um sistema feito.
A estrutura da banco de dados nao é muito boa... Muito bom!!


http://www.mundodaweb.com.br
22/07/2008 7:19pm (~16 anos atrás)

fccd disse:
Que legal esse artigo...


Show
12/01/2008 10:20am (~17 anos atrás)

NuNuNO disse:
Muito menos matematico, se você tem três campos para UMA data... Por que não usar o concat na hora de comparar?

Por exemplo:

select * from clinetes concat(anoexpira,'-',$mesexpira,'-',diaexpira) >= curdate()

Testei no mySql 5.0, talvez em versões anteriores você precise usar o cast junto com o concat...

Grande Abraço
=NuNuNO==
( Que adora usar o IF em consultas, mas usa de outras formas... )

PS: É muito recomendado utilizar o tipo DATE do mySQL ao inves de trÊs campos integer...
19/01/2007 3:28pm (~18 anos atrás)

Cara, esse artigo veio em boa hora... Queria fazer a mesma coisa que você fez.
Aqui deu tudo certo.

Abraços
17/07/2005 6:35pm (~19 anos atrás)

Pega os 3 campos e concatena com CONCAT(), depois usa o comando DATE() para o mysql considerar e formatar como uma data, depois é só comparar com a data atual CURDATE().

SELECT * FROM clientes
WHERE DATE( CONCAT( ano , '-' , mes , '-' , dia ) ) > CURDATE();

Isso vai retornar todos os clientes que expiram de amanhã para frente...

Se quiser com mais tempo
> CURDATE() + INTERVAL 1 MONTH

etc...
15/07/2005 7:23am (~19 anos atrás)

Aproveitando a deixa, não sei se estou usando corretamente o espaço, mas comumente me deparo com o seguinte problema: uma tabela de clientes, com um bit indicando se é pessoa física ou jurídica; outras 2 tabelas (uma para PF outra para PJ) com os dados específicos de cada uma.

Existe alguma maneira de indicar no operador condicional, para mais de um registro no retorno, dizer para qual tabela o MySQL deve fazer o join para cada registro?
27/01/2004 7:20am (~21 anos atrás)

Cléver, acho que para esse caso seria melhor usar a função IFNULL(expr1,expr2), que retorna a expressão 1 se ela não for NULL; se for, retorna EXPR2.

Outro estrutura bem útil é o CASE, primeiro tópico da página de funções de controle de fluxo na página de ajuda do MySQL.
27/01/2004 7:18am (~21 anos atrás)

Cléver Anjos disse:
Uma utilização interessante é trazer algum valor de colunas que admitem NULL.

Exemplo :

SELECT nome, IF ( endereco is null, "Endereco nao preenchido", endereco) FROM enderecos ORDER BY nome

19/01/2004 7:35am (~21 anos atrás)

O intuito do artigo é a syntax do if.
04/01/2004 3:05pm (~21 anos atrás)

A melhor solução é concatenar as datas ano+mes+dia, assim você terá mais facilidade para comparar e não vai condicionar a sua instrução. O próprio MySql organiza as datas desta forma.
31/12/2003 8:00am (~21 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)