Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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;
?>>
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](https://www.w3schools.com/sql/sql_groupby.asp).
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
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
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:
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>
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:
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

gamesmax2
Felipe Guedes Coutinho