Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Oi pessoas.. preciso de ajuda para tentar melhorar essa consulta..
Eu tenho uma tabela que registra todas vendas feitas.. e preciso encontrar os clientes que fizeram compra no mês passado, mas que ainda não compraram esse mês..
Por enquanto eu estou fazendo assim:
<?php
$u = mysql_query("SELECT id_cliente FROM tab_vendas WHERE data_venda BETWEEN '2017-03-01' AND '2017-03-31' GROUP BY id_cliente");
while($r = mysql_fetch_assoc($u)){
// Consulta se tem venda no mês atual:
$h = mysql_query("SELECT id_cliente,data_ultima_compra FROM tab_vendas
WHERE data_venda BETWEEN '2017-04-01' AND '2017-04-30' AND id_cliente=$r[id_cliente]");
// Se não encontrar resultados exibe o cliente
if (mysql_num_rows($h)==0) {
$z = mysql_fetch_assoc($h);
echo $z['id_cliente'].' - '.$z['data_ultima_compra'].'<br>';
}
}
?>
Essa consulta até funciona bem... mas quando eu pego uma tabela muito grande ela demora, e as vezes esgota o tempo do servidor.
Alguém tem alguma ideia de como posso melhorar isso?A quantidade de resultados que $u trazer, sera o tanto de vezes que você terá que ir no banco, para obter $h
Se $u trazer 100 id_clientes, sera feita 100 consultas no banco.
Considerando que entendi o seu problema, da forma abaixo, sera feita apenas uma consulta!
<?php
$u = mysql_query("
SELECT id_cliente,data_ultima_compra
FROM tab_vendas
WHERE data_venda
BETWEEN '2017-04-01' AND '2017-04-30'
AND id_cliente
NOT IN(SELECT id_cliente
FROM tab_vendas
WHERE data_venda
BETWEEN '2017-03-01' AND '2017-03-31'
GROUP BY id_cliente)"
); echo $z['id_cliente'].' - '.$z['data_ultima_compra'].'<br>';
}EdCesar me parece que dessa forma vai trazer clientes que compraram no mês passado e também os que ainda não compraram esse mês e o que a colega quer é trazer só os que compraram no mês passado mas não compraram nesse mês. não tem que inverter os SELECT e botar NOT IN não?
Bem observado! Fiz a correção!
Obrigado pela ajuda.. mudei a consulta da maneira que o Edcesar sugeriu e continuou lenta... Então eu criei um índice pro campo data_venda e resolveu...
Mas a minha duvida é... usando essa sub query ele também não vai fazer as 100 consultas no banco?
>
1 hora atrás, EdCesar disse:
Se $u trazer 100 id_clientes, sera feita 100 consultas no banco.
não no caso vai fazer uma consulta e trazer duma vez todos os resultados. imagina o seguinte tu tem uma pasta numa gaveta dum armário com 100 documentos. imagina se tu vai lá e pega dados desses documentos e bota cada um noutras 100 pastas. aí em duas consultas tu teria que pegar a pasta dos 100 documentos e depois procurar os outros 100 documentos. já sem fazer essa divisão tu vai buscar uma pasta só com tudo junto. ficou meio sem noção a comparação mas é só pra ilustrar a parada mesmo
>
1 minuto atrás, danicarla disse:
Então eu criei um índice pro campo data_venda e resolveu...
Primeiro que bom que você resolveu! Mas nesse caso, então você tinha pelo menos dois problemas, sendo que o problema do indice era o principal.
>
3 minutos atrás, danicarla disse:
Mas a minha duvida é... usando essa sub query ele também não vai fazer as 100 consultas no banco?
No caso de 100 registros, usando a sub-query, trara os 100 registros em apenas uma consulta, da forma anterior, iria trazer os 100 registros, fazendo 100 consultas ao banco.
O Marsolim foi muito didático!
Exatamente.. obrigada gente :)
Dani Carla ou Daniel Carlos? (Está com sexo == masculino...)
Só fiquei na dúvida, ignorem...
@Jadilson o sexo do usuário é relevante onde em um forum de perguntas? (não deu pra ignorar )
@danicarla
Sobre o índice 'arrazou' kkkk eu to aprendendo muito sobre performance, veja se os links abaixo te ajudam nisso:
http://rberaldo.com.br/o-problema-do-n-mais-1/
Aqui tmb:
https://pt.stackoverflow.com/questions/6441/qual-é-a-diferença-entre-inner-join-e-outer-join
Lembrando que funções mysql_* estão obsoletas.
@gabrieldarezzo Nenhuma relevância meu caro... Apenas comentei o que observei.
Pena minha pergunta ainda não ter tido a atenção de ninguém. Vou comentar algo irrelevante lá também para ver se consigo....
De qualquer maneira devo desculpas a pessoa identificada como Dani Carla. De fato, não tem relevância a minha observação.
tenta usar COUNT na mesma pesquisa pra contar quem não comprou nesse mês