Ir para conteúdo

POWERED BY:

Arquivado

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

danicarla

Encontrar registros não coincidentes, ajuda para melhor consulta

Recommended Posts

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

tenta usar COUNT na mesma pesquisa pra contar quem não comprou nesse mês

Compartilhar este post


Link para o post
Compartilhar em outros sites

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)"
    );
while($z = mysql_fetch_assoc($u)){
    echo $z['id_cliente'].' - '.$z['data_ultima_compra'].'<br>';
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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?

Compartilhar este post


Link para o post
Compartilhar em outros sites

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.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

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 :smile:

Compartilhar este post


Link para o post
Compartilhar em outros sites
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! 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Jadilson o sexo do usuário é relevante onde em um forum de perguntas? (não deu pra ignorar :tounge_wink:)

 

@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.

Recomendo atualizar as mesmas para PDO, ou Mysqli.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por violin101
      Caros amigos, saudações.
       
      Humildemente peço desculpa por postar uma dúvida que tenho.

      Preciso salvar no MySql, os seguinte Registro:

      1 - Principal
      ====> minha dúvida começa aqui
      ==========> como faço para o Sistema Contar Automaticamente o que estiver despois do 1.____?
      1.01 - Matriz
      1.01.0001 - Estoque
      1.01.0002 - Oficina
      etc

      2 - Secundário
      2.01 - Loja_1
      2.01.0001 - Caixa
      2.01.0002 - Recepção
      etc
       
      Resumindo seria como se fosse um Cadastro de PLANO de CONTAS CONTÁBEIL.

      Grato,


      Cesar









       
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer a orientação dos amigos.

      Preciso fazer um Relatório onde o usuário pode Gerar uma Lista com prazo para vencimento de: 15 / 20/ 30 dias da data atual.

      Tem como montar uma SQL para o sistema fazer uma busca no MySql por período ou dias próximo ao vencimento ?

      Tentei fazer assim, mas o SQL me traz tudo:
      $query = "SELECT faturamento.*, DATE_ADD(faturamento.dataVencimento, INTERVAL 30 DAY), fornecedor.* FROM faturamento INNER JOIN fornecedor ON fornecedor.idfornecedor = faturamento.id_fornecedor WHERE faturamento.statusFatur = 1 ORDER BY faturamento.idFaturamento $ordenar ";  
      Grato,
       
      Cesar
       
       
       
       
    • Por violin101
      Caros amigos, saudações
       
      Por favor, me perdoa em recorrer a orientação dos amigos, tenho uma dúvida.
       
      Gostaria de uma rotina onde o Sistema possa acusar para o usuário antes dos 30 dias, grifar na Tabela o aviso de vencimento próximo, por exemplo:
       
      Data Atual: 15/11/2024
                                           Vencimento
      Fornecedor.....................Data.....................Valor
      Fornecedor_1...........01/12/2024..........R$ 120,00 <== grifar a linha de Laranja
      Fornecedor_1...........01/01/2025..........R$ 130,00
      Fornecedor_2...........15/12/2024..........R$ 200,00 <== grifar a linha de Amarelo
      Fornecedor_2...........15/01/2025..........R$ 230,00
      Fornecedor_3...........20/12/2024..........R$ 150,00
       
      Alguém tem alguma dica ou leitura sobre este assunto ?

      Grato,
       
      Cesar
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer a ajuda dos amigos, mas preciso entender uma processo que não estou conseguindo sucesso.

      Como mencionado no Título estou escrevendo um Sistema Web para Gerenciamento de Empresa.
       
      Minha dúvida, que preciso muito entender:
      - preciso agora escrever a Rotina para Emissão de NFe e essa parte não estou conseguindo.
       
      tenho assistido alguns vídeos e leituras, mas não estou conseguindo sucesso, já fiz toda as importações das LIB da NFePhp conforme orientação.

      Preciso de ajuda.

      Algum dos amigos tem conhecimento de algum passo-a-passo explicando a criação dessa rotina ?

      tenho visto alguns vídeos com LARAVEL, mas quando tento utilizar e converter para PHP+Codeiginter, dá uma fila de erros que não entendo, mesmo informando as lib necessárias.

      Alguns do amigo tem algum vídeo, leitura explicando essa parte ?

      Grato,

      Cesar.
    • Por violin101
      Caros amigos, saudações.

      Por favor, me perdoa em recorrer ao auxílio dos amigos, mas preciso entender e resolver um problema.
       
      Tenho uma Rotina que o usuário seleciona os produtos que deseja para requerer ao setor responsável.
       
      O usuário escolhe um produto qualquer e Clicla em um button para incluir a lista.

      O problema que estou enfrentando é que após escolher o produto e teclar ENTER o Sistema já salva no BD.
       
      Gostaria de criar uma Tecla de Atalho, para quando incluir/escolher o produto na lista, o usuário tecla como exemplo:
      ALT+A  para agregar a lista
      ALT+S para salvar a lista de itens desejados.

      Assim, quando teclar enter, o sistema não dispara o GRAVAR na Base de Dados.

      Grato,

      Cesar
       
       
       
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.