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 ILR master
      Tudo bem pessoal?
       
      No código abaixo, estou fazendo uma consulta nas tabelas, banners e banners_referencia
      Meu objetivo é trazer resultados com valores iguais ao nome da cidade declarada na $cidade ou resultados com a referencia Total.
      O problema é que está trazendo todos os resultados. Tenho 10 linhas, 1 com o nome da cidade e duas com o valor Total, então o resultado teria que ser de apenas 3 linhas, mas mostra tudo.
       
      $banner = "SELECT A.*, B.* FROM banners A, banners_referencia B WHERE B.cod_referencia = A.cod_referencia AND A.cidade = '$cidade' OR B.referencia = 'Total' ORDER BY RAND()";
      $banner = mysqli_query($conexao, $banner) or die ("Banner não encontrado");
      while($busca= mysqli_fetch_array($banner)){
          print $busca['cidade'].'<br>';
      };
       
      Alguém consegue me ajudar?
    • Por Rafael_Ferreira
      Não consigo carregar a imagem do captcha do meu formulário. Foi testado com o xampp e easyphp. Também não carregou a imagem de outros captcha. 
       
       
    • Por luiz monteiro
      Olá, tudo bem?
       
      Estou melhorando meu conhecimento em php e mysql e, me deparei com o seguinte. A tabela da base de dados tem um campo do tipo varchar(8) o qual armazena números. Eu não posso alterar o tipo desse campo. O que preciso é fazer um select para retornar o números que contenham zeros a direita ou a esquerda.
      O que tentei até agora
       
      Ex1
      $busca = $conexao->prepare("select campo form tabela where (campo = :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form']);
       
      Se a direita da string $_REQUEST['campo_form'] termina ou inicia com zero ou zeros, a busca retorna vazio.
      Inseri dados numéricos, da seguinte maneira para testar: 01234567;  12345670: 12345678: 12340000... entre outros nessa coluna. Todos os valores que não terminam ou não iniciam com zero ou zeros, o select funciona.
       
       
      Ex2
      $busca = $conexao->prepare("select campo form tabela where (campo = 0340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex3
      $busca = $conexao->prepare("select campo form tabela where (campo = '02340001' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex4
      $busca = $conexao->prepare("select campo form tabela where (campo like 2340000) ");
      Esse número está cadastrado, mas não retorna.
       
      Ex5
      $busca = $conexao->prepare("select campo form tabela where (campo like '12340000') ");
      Esse número está cadastrado, mas não retorna.
       
      Ex6
      $busca = $conexao->prepare("select campo form tabela where (campo like '"12340000"' ) ");
      Esse número está cadastrado, mas não retorna.
       
       
      Ex7
      $busca = $conexao->prepare("select campo form tabela where (campo like :campo) ");
      $busca->bindParam('campo', $_REQUEST['campo_form'])
      Não retorna dados.
       
      O  $_REQUEST['campo_form'] é envio via AJAX de um formulário. 
      Usei o gettype para verificar o post, e ele retorna string.
      Fiz uma busca com número 12345678 para verificar o que o select retorna, e também retrona como string.
       
      Esse tipo de varchar foi usado porque os números que serão gravados nesse campo,  terão zeros a direita ou na esquerda. Os tipos number do mysql não gravam zeros, então estou usando esse. O problema é a busca.
      Agradeço desde já.
       
       
    • Por daemon
      Boa tarde,
       
      Eu tenho uma rotina que faz uma leitura do arquivo .xml de vários sites.

      Eu consigo pegar o tópico e a descrição, e mostrar a imagem que esta na pagina do link.
      Para isso utilizo esta função:
      function getPreviewImage($url) { // Obter o conteúdo da página $html = file_get_contents($url); // Criar um novo objeto DOMDocument $doc = new DOMDocument(); @$doc->loadHTML($html); // Procurar pela tag meta og:image $tags = $doc->getElementsByTagName('meta'); foreach ($tags as $tag) { if ($tag->getAttribute('property') == 'og:image') { return $tag->getAttribute('content'); } } // Se não encontrar og:image, procurar pela primeira imagem na página $tags = $doc->getElementsByTagName('img'); if ($tags->length > 0) { return $tags->item(0)->getAttribute('src'); } // Se não encontrar nenhuma imagem, retornar null return null; } // Uso: $url = "https://example.com/article"; $imageUrl = getPreviewImage($url); if ($imageUrl) { echo "<img src='$imageUrl' alt='Preview'>"; } else { echo "Nenhuma imagem encontrada"; }  
      Mas estou com um problema, esta funcão funciona quando coloco em uma pagina de teste.php. Preciso mostrar em uma página inicial diversas fotos de todos os links. (No caso acima só funciona 1).
×

Informação importante

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