last day (15 days later) » 

6:02 PM
0
Q: Condicional IF dentro de consulta SQL

Carlos RochaTenho a seguinte consulta: $string = " SELECT DISTINCT(idClientes), nome FROM clientes WHERE idClientes IN ( SELECT idClientes FROM planosclientes WHERE idPlanosClientes IN ( SELECT distinct(idPlanoClientes) FROM pagamentos WHERE mesReferencia NOT IN ('".$mesReferencia."') ) and DATEDI...

 
Sua consulta ficaria muito melhor (e mais rápida) se utilizasse JOINS, mas para lhe ajudar precisaria ver a estrutura das tabelas em uso. Outra dica é utilizar as próprias funções do banco para fazer o cálculo da data ao invés de concatenaruma função PHP na sua consulta sql
 
Coloquei a estrutura das tabelas!
 
Elas não tem foreign keys? ou você não colocou ?
 
tem mas não coloquei. Informei isso na SQL $mesReferencia vem do formulário e $dias também pois são dias e atraso
Se CURDATE(),'%d' ) < diaVencimento, a variavél $mesReferencia ***que recebe ***date('Y-m') do php seja decrescida em 1 mês e caso contrário, se mantém
 
Algumas dúvidas: 1 - O mês referência que você passa do PHP é sempre o mês atual (date(Y-m)) ou pode ser um valor informado? 2 - O objetivo dessa linha DATEDIFF (CURDATE(), CONCAT(DATE_FORMAT(CURDATE(),'%Y,%m' ),'-', diaVencimento)) é diminuir a data atual da data formada pelo concat com o diaVencimento para comparar com a $dias , se for o que deve acontecer se o curdate retornar um dia menor que a data da concatenação ? 3 - Você criou um union de idClientes com idPlanosClientes isso está correto? não faz sentido!
4 - O union é para tirar todos os clientes que tem planos mas não tem pagamentos ?
 
6:02 PM
1) mesReferencia é o mês corrente. Caso o diaVencimento que é próprio de cada contratação de plano for após o dia da tiragem do relatório, então o mesReferencia para aquele lançamente precisa ser o anterior! 2) Saber quantos dias em atraso o cliente esta desde o dia do vencimento até a data da tiragem 3) As 2 clausulas unidas por Union pedem idPlanosClientes e estão dentro de um IN() 4) isso, clientes que tem plano mas não pagou nenhuma mês ainda!
toki
 
Você precisa resolver dois problemas então: 1 - O seu union não está no local correto, ele está sendo usado com a query do SELECT idClientes (provavelmente por conta dos parênteses do datediff) e 2 - "Saber quantos dias em atraso o cliente esta desde o dia do vencimento até a data da tiragem" isso é uma informação ou um filtro ? se for uma informação deve ser tirada do where se for um filtro o correto seria: trazer todos os clientes com dias em atraso baseado no cálculo, é isso ?
 
1) Pelo phpMyAdmin o UNION esta no local correto! Confere fazendo favor?
2) um filtro, o clinte diita a quantidade de dias em atraso quer escolher!
Dias em atraso => data atual - dataVencimento
Se a dataAtual for antes da diaVencimento, então o mês atual não deve ser computado para o cliente. Mas sim o mes anterior
 
Na sua query na questão, não, não está. Já conferi. OK quanto ao segundo...
 
6:25 PM
Para clientes que tem planos e não pagaram nada ainda, acredito que o uso do inner join já exclui esses clientes, uma vez que faço a junção dos clientes que tem planos e que pagaram.
 
De fato, tinha um parênteses fechado no local errado. Já arrumei!
 
vou colocar a consulta como resposta, caso você encontre algum problema é só falar nos comentários.
 
vamos terminar por aqui antes?
ata, ok
 

last day (15 days later) »