Jump to content
gamesmax2

remover dados duplicados de uma string ou sql

Recommended Posts

Boa noite, pessoal estou tentando remover dados duplicadas do banco de sql .

 

estou criando um gráfico de avarias e faço consulta pelo banco de dados, já tentei tentei DISTINCT, Group, order e array_unique e nada funcionou.

Tenho o banco de dados vários registro no mesmo dia, quero  remover todos os dias duplicados e mostra apenas um registro.

 

exemplo no dia 21 teve 5 registro, fazendo a consultar vai me retornar o 5 registro com  dia 21 , quero apenas que me retorne um registro.

 

pessoal do forum, peço que me ajude, por favor estou quebrando a cabeça.

        <?php
            
     
//aqui pega dados de ate um ano da data do banco de dados\\

$sql1 = "SELECT * FROM avaria WHERE YEAR(data) = YEAR(CURRENT_DATE)";
$stmt1 = $PDO->prepare($sql1);
$stmt1->execute();
 
 
 while($avaria = $stmt1->fetch(PDO::FETCH_ASSOC)):
     
     
  $datadia = date("d", strtotime($avaria['data']));
    $datames = date("m", strtotime($avaria['data']));
   
//aqui e o problema faço o filtro extraio a data e pego apenas o dia e o mes, so que continua aparece pois tem varios dados do mesmo dia, quero quer remover essa duplicidade de dias e memanda apenas um registro para pode fazer o grafico, ja tentei de tudo e nada funcionou\\

$sql2 = "SELECT DISTINCT EXTRACT(day FROM data) as data  FROM avaria where DAY(data) = '$datadia' AND MONTH(data) = '$datames' ";
$stmt2 = $PDO->prepare($sql2);
$stmt2->execute();   
     while($avaria1 = $stmt2->fetch(PDO::FETCH_ASSOC)):

  $data3 = date("d", strtotime($avaria1['data'])) ;
  $valores = $avaria1;




  // vamos remover os elementos duplicados
  $valores = array_unique($valores, $data3);
  
  // vamos exibir os valores do array novamente
  echo "<br>";
  foreach($valores as $valor){
    echo $valor . " - ";
  }


 // manter duplicados diferenciando dos demais
  $valores = array_unique($valores);
  
  // vamos exibir os valores do array novamente
  echo "<br><br>Elementos duplicados:<br>";
  foreach($valores as $valor){
    echo $valor . " - ";
  }


  endwhile;


  endwhile;
  
?>    

 

Share this post


Link to post
Share on other sites

gamesmax2

SELECT DISTINCT EXTRACT(day FROM data) as data  FROM avaria where DAY(data) = '$datadia' AND MONTH(data) = '$datames' group by DAY(data), MONTH(data) LIMIT1";

Experimenta colocar GROUP BY, este comando agrupa todos os resultados IGUAIS.

 

Exemplo tabela:

dia.         mes

1             1

1             2

1             1

2             2

2             2

-------------------

5 registros.

 

Na tabela acima tenho 5 registros

Se eu agrupar por DIA e por MÊS, meu resultado será

dia.         mes

1             1

1             2

2             2

-------------------

3 registros.

 

Se eu quiser trazer apenas 1 registro adiciono o comando LIMIT 1 e o meu resultado será

dia.         mes

1             1

-------------------

1 registro.

 

Recomendo você ler sobre GROUP BY dentro do artigo do W3SCHOOLS.

 

Posso realizar ordenação ORDER BY DIA DESC, MES DESC e o meu resultado final será

dia.         mes

2             2

-------------------

1 registro.

 

Se a resposta lhe for útil, não esqueça de agradescer o POST e votar positivo.

Espero ter ajudado de alguma forma

 

Att
Felipe Guedes Coutinho

Share this post


Link to post
Share on other sites
24 minutos atrás, Felipe Guedes Coutinho disse:

gamesmax2


SELECT DISTINCT EXTRACT(day FROM data) as data  FROM avaria where DAY(data) = '$datadia' AND MONTH(data) = '$datames' group by DAY(data), MONTH(data) LIMIT1";

 Experimenta colocar GROUP BY, este comando agrupa todos os resultados IGUAIS.

 

Exemplo tabela:

dia.         mes

1             1

1             2

1             1

2             2

2             2

-------------------

5 registros.

 

Na tabela acima tenho 5 registros

Se eu agrupar por DIA e por MÊS, meu resultado será

dia.         mes

1             1

1             2

2             2

-------------------

3 registros.

 

Se eu quiser trazer apenas 1 registro adiciono o comando LIMIT 1 e o meu resultado será

dia.         mes

1             1

-------------------

1 registro.

 

Recomendo você ler sobre GROUP BY dentro do artigo do W3SCHOOLS.

 

Posso realizar ordenação ORDER BY DIA DESC, MES DESC e o meu resultado final será

dia.         mes

2             2

-------------------

1 registro.

 

Se a resposta lhe for útil, não esqueça de agradescer o POST e votar positivo.

Espero ter ajudado de alguma forma

 

Att
Felipe Guedes Coutinho

Sim o do limit eu sei, só que eu quero que mostre pro exemplo apenas um resultado do dia 1 mesmo que exista 100 registro no banco de dados, quero que tenha todos os dados mas não quero que duplique o dia

 

dia   mes

1      1

2       1

3        1

 

então nesse caso a função Limit não funciona, acho que seria melhor utilizar algum tipo de array, só que array_unique não funcionou, não sei se é meu código que esta bagunçado

Share this post


Link to post
Share on other sites

gamesmax2

Eu escrevi tanta informação e dei mais do que uma só dica com exemplo e LINK e você só se resumiu em ler sobre o LIMIT

 

Experimenta o GROUP BY como eu mencionei no meu POST anterior, o GROUP BY ELIMINA REGISTROS COM INFORMAÇÕES DUPLICADAS que é o seu caso.

 

Faça um teste usando o GROUP BY e seja feliz.

 

Se precisa de dicas eu RECOMENDO LER SOBRE  W2SCHOOLS - GROUP BY (COM EXEMPLO) LEIA.

 

Se a resposta lhe for útil, não esqueça de agradescer o POST e votar positivo.

Espero ter ajudado de alguma forma

 

Att
Felipe Guedes Coutinho

Share this post


Link to post
Share on other sites

Experimenta isso:

 

$sql2 = "SELECT EXTRACT(day FROM data) as data  FROM avaria where DAY(data) = '$datadia' AND MONTH(data) = '$datames' GROUP BY DATA";

Avise se funcionar ou não.

 

Caso não, cole aqui uma imagem da ESTRUTURA DA SUA TABELA, como essa:image.thumb.png.ec06db1218655ceaff03457c89be6b17.png

 

Para que eu possa montar para você a clausula onde você busca por DIA e MÊS e ela retorne apenas 1 registro de cada DIA e MÊS;

 

Se a resposta lhe for útil, não esqueça de agradescer o POST e votar positivo.

Espero ter ajudado de alguma forma

 

Att
Felipe Guedes Coutinho

Share this post


Link to post
Share on other sites
Em 31/07/2019 at 23:18, Felipe Guedes Coutinho disse:

Experimenta isso:

 


$sql2 = "SELECT EXTRACT(day FROM data) as data  FROM avaria where DAY(data) = '$datadia' AND MONTH(data) = '$datames' GROUP BY DATA";

Avise se funcionar ou não.

 

Caso não, cole aqui uma imagem da ESTRUTURA DA SUA TABELA, como essa:image.thumb.png.ec06db1218655ceaff03457c89be6b17.png

 

Para que eu possa montar para você a clausula onde você busca por DIA e MÊS e ela retorne apenas 1 registro de cada DIA e MÊS;

 

Se a resposta lhe for útil, não esqueça de agradescer o POST e votar positivo.

Espero ter ajudado de alguma forma

 

Att
Felipe Guedes Coutinho

 

 

Desculpe pela demora, ja tentei o  Group BY, não funcionou.

segue a imagem da minha tabela

 

Sem título-4.jpg

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Vibraphera
      Oi gente eu recentemente comecei a aprender php e fui atras de desafios legais e me deparei com um que até hoje não consigo resolver.
      Preciso mostrar a maior e a menor palavra de uma frase ou texto. Eu tentei transformar em um array mas não sei se seria o adequado.
      Resumindo apenas me retorna corretamente a maior palavra mas a menor não me retorna nada. ALGUÉM ME DA UM HELP kk
      OBS: quando não tem ponto final parece que não retorna nada e quando tem ponto final ele retorna o 'ou' da frase mas não deveria retornar a letra 'é' ou a letra 'a'?
       
      <?php
      $texto = 'Como faço para saber qual é a menor e a maior de uma frase ou grandes textos';
      $arr = explode(" ", $texto);
      $maior="";
      $menor="";
      for ($i=0; $i <count($arr) ; $i++) { 
          $atual = $arr[$i];
          if (strlen($atual) > strlen($maior)) {
              $maior = $atual;
          } else if (strlen($atual) < strlen($maior)) {
              $menor = $atual;
          }
      }
      echo "<br>";
      echo $maior;
      echo "<br>";
      echo $menor;
    • By danteblatt
      Olá Srs,
      Não tenho muito conhecimento em PHP e estou com um formulário onde o usuário tem alguns campos para preencher e gravar no banco de dados SQL, sendo que um campo deste form será dinâmico onde o usuário poderá adicionar quantos campos forem necessários a partir de um botão "+".
      Nome do campo dinâmico: chavenf
      Segue abaixo o código do formulário:
      <form method="POST" action="../includes/mf-processa.php"> <div class="form-group"> <div class="form-row"> <div class="form-group col-md-4"> <input type="hidden" name="usuario[]" value="<?php echo $_SESSION['usuarioNome']; ?>" /> <select class="form-control" id="tipo" name="tipo[]"> <option selected>Tipo</option> <option>1</option> <option>2</option> </select> </div> <div class="form-group col-md-4"> <select class="form-control" id="prioridade" name="prioridade[]"> <option selected>Prioridade</option> <option>Alta</option> <option>Padrão</option> </select> </div> <div class="form-group col-md-4"> <input class="form-control" type="text" name="fornecedor[]" placeholder="Fornecedor" id="fornecedor"> </div> </div> <div style="display:none;" class="form-row" id="chavecte"> <div class="form-group col-md-12"> <label>Chave </label> <input class="form-control" type="text" name="chavecte[]"> </div> </div> <div class="form-row" id="row-nota"> <div class="form-group col-md-12"> <label>Chave da NF </label> <input class="form-control" type="text" name="chavenf[]" id="chavenf"> </div> </div> <div style="display:none;" class="form-row" id="add-field-nf"> <div class="form-group col-md-2"> <button type="button" class="btn btn-primary" id="add"> + </button> </div> </div> <div class="form-row"> <div class="form-group col-md-2"> <input type="submit" class="btn btn-primary" value="Cadastrar"> </div> </div> </div> </form> <script> $( "#add" ).click(function() { $( "#row-nota" ).append('<div class="form-group col-md-12"><input class="form-control" type="text" name="chavenf[]" id="chavenf"></div>'); }); </script> Abaixo o arquivo que conecta e insere no BD, "mf-processa.php"
      <?php session_start(); include_once("conexao.php"); $prioridade = filter_input(INPUT_POST, 'prioridade', FILTER_SANITIZE_STRING); $usuarioentrada = filter_input(INPUT_POST, 'usuario', FILTER_SANITIZE_STRING); $tipofrete = filter_input(INPUT_POST, 'tipofrete', FILTER_SANITIZE_STRING); $fornecedor = filter_input(INPUT_POST, 'fornecedor', FILTER_SANITIZE_STRING); $chavenf = preg_replace("/\s+/", "", filter_input(INPUT_POST, 'chavenf', FILTER_SANITIZE_STRING)); $chavecte = preg_replace("/\s+/", "", filter_input(INPUT_POST, 'chavecte', FILTER_SANITIZE_STRING)); $nNF = substr($chavenf, 25, 9); $timenow = date('d-m-Y'); $timenow .= ' '.date('H:i:s'); $qtnotas = count($chavenf)-1; for ($f = 0; $f <= $qtnotas; $f++) { $sql = "INSERT INTO base (data, usuarioentrada, prioridade, tipofrete, nf, fornecedor, chavenf, chavecte, acao, dataretorno, usuariofiscal) VALUES ( '.$timenow[$f].', '.$usuarioentrada[$f].', '.$prioridade[$f].', '.$tipofrete[$f].', '.$nNF[$f].', '.$fornecedor[$f].', '.$chavenf[$f].', '.$chavecte[$f].', '', '', '' )" or die ("<center>Erro: " . mysqli_error() . "</center>"); $insert = mysqli_query($conn, $sql); if(mysqli_insert_id($conn)){ $_SESSION['msgrec'] = "<p style='color:green;'>Nota cadastrada com sucesso!</p>"; header("Location: ../recebimento/recebimento.php"); }else{ $_SESSION['msgrec'] = "<p style='color:red;'>Nota não cadastrada com sucesso!</p>"; header("Location: ../recebimento/recebimento.php"); }  
       
      Veja o erro retornado na página.. Já tentei alterar o código e mesmo assim não consegui efetuar a inserção dos dados no BD.
       
      ( ! ) Warning: count(): Parameter must be an array or an object that implements Countable in D:\Wamp\www\RecebimentoAdm\includes\mf-processarecebimento.php on line 31 Call Stack # Time Memory Function Location 1 0.0001 411528 {main}( ) ...\mf-processarecebimento.php:0  
      ( ! ) Notice: Uninitialized string offset: 0 in D:\Wamp\www\RecebimentoAdm\includes\mf-processarecebimento.php on line 41 Call Stack # Time Memory Function Location 1 0.0001 411528 {main}( ) ...\mf-processarecebimento.php:0  
      ( ! ) Notice: Uninitialized string offset: 0 in D:\Wamp\www\RecebimentoAdm\includes\mf-processarecebimento.php on line 42 Call Stack # Time Memory Function Location 1 0.0001 411528 {main}( ) ...\mf-processarecebimento.php:0
    • By lordstarlight
      Olá, 
       
      Como posso bloquear todos ips, menos o meu para acesso ao meu site?
      preciso fazer isto para poder fazer manutenção.
       
      obrigado!
    • By lordstarlight
      Olá pessoal,
       
      Tenho uma base de dados onde há um campo decimal que guarda um valor tipo (10.20).
      Quanto tento retornar o valor multiplicado por quantidade (10.2 * 2) retorna apenas 20,00
       
      $subTotal = $qtdeItem * $precoProduto;
      echo  'R$ '.number_format($subTotal,2,",",".");?><br>
       
      Como faço para retornar 20,40 ?
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.