Ir para conteúdo

POWERED BY:

Arquivado

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

xnando

While dentro de outro while, não repetir valores.

Recommended Posts

Olá galera, mais uma vez venho aqui tentar pedir ajuda aos senhores para a solução de um problema na geração de um relatório em PHP e MySQL, a questão é a seguinte, segue código abaixo:

 

$qryTbObras = "SELECT * FROM tb_obras"; 
$resTbObras = mysql_query($qryTbObras, $molde) or die(mysql_error());			

 

 

<?php 
										while ($iObras = mysql_fetch_assoc($resTbObras)) {
											$qryTbAditivos = "
SELECT tb_obras.id_obra, tb_aditivos.QtdTempo, tb_aditivos.tb_obras_id_obra, tb_obras.NumContrato, tb_obras.DataTermino, tb_obras.orgao, tb_obras.TipoContrato
FROM tb_obras 
LEFT JOIN tb_aditivos ON (tb_obras.id_obra = tb_aditivos.tb_obras_id_obra)
WHERE tb_aditivos.tb_obras_id_obra = ". $iObras['id_obra'] ."
ORDER BY tb_aditivos.tb_obras_id_obra
";		
											$resTbAditivos = mysql_query($qryTbAditivos, $molde) or die(mysql_error());
while($iAditivos = mysql_fetch_assoc($resTbAditivos)) {
if (mysql_num_rows($resTbAditivos) > 0) {
$somaAditivos = $somaAditivos + $iAditivos['QtdTempo'];
$dtTermino = strftime("%d/%m/%Y", strtotime($iObras['DataTermino']));
$dtAtual = date("d/m/Y");
$dtAditivos = somarDatas($dtTermino, $somaAditivos, 0, 0);
$diferencaDatas = diff_dias("$dtAtual","$dtAditivos");	
if ($diferencaDatas <= 120) {													
?>
<tr>
<td><? echo $iObras['TipoContrato'] ."-". $iAditivos['NumContrato'] ."-". $iAditivos['orgao']; ?></td>
<td><? echo $dtAditivos ?></td>
<td><? echo $diferencaDatas ?></td>
</tr>

<?php
}
} 	
}
}	
?>

 

Explicando o código que tá muito simples (desculpa pela identação, quando colei veio tudo assim), primeiro seleciono na tabela tb_obras para pegar o id_obra que vai ser utilizado no SQL da tabela tb_aditivos, nessa tabela tem um campo que eu preciso utilizar, que é o QtdTempo, verifico se existe algum aditivo referente àquela obra e faço a soma com uma função somarDatas, logo em seguida vejo se a soma é menor ou igual a 120 e os exibo em uma linha de uma tabela.

 

O código todo está funcionando normalmente. A grande questão é, toda volta que o while dá ele exibe as linhas, porque ele tá mostrando todos os valores menores que 120, minha pergunta é, como eu faço pra exibir os valores somente uma vez, comparar somente uma vez se aquela id_obra + seus aditivos estão abaixo de 120 e exibi-los apenas uma vez também.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara.. olhando superficialmente.. exclua a consulta de fora.

 

simples assim. Vc não precisa dela.

E ai a consulta interna, remova o where id

ryTbAditivos = "
SELECT tb_obras.id_obra, tb_aditivos.QtdTempo, tb_aditivos.tb_obras_id_obra, tb_obras.NumContrato, tb_obras.DataTermino, tb_obras.orgao, tb_obras.TipoContrato
FROM tb_obras 
LEFT JOIN tb_aditivos ON (tb_obras.id_obra = tb_aditivos.tb_obras_id_obra)
ORDER BY tb_aditivos.tb_obras_id_obra
";

tecnicamente, vai fazer a mesma coisa, com 1 loop e 1 consulta a menos. E sem duplicar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigado Bruno, realmente solucionou, adicionei um GROUP BY e agora ele de fato está agrupando por id_obra, porém, ele não está mais somando. De qualquer forma, muito obrigado pela luz, não sabia que poderia utilizar uma query sem um WHERE.



Se eu retirar o GROUP BY ele soma e repete os valores, com GROUP BY ele não repete, e também não soma. Mais alguma divina luz?

Compartilhar este post


Link para o post
Compartilhar em outros sites

No caso, o SUM faria a soma de todos os campos da tabela sem diferenciá-los por id_aditivo, infelizmente a soma não é o total, tenho que pegar o id_obra e verificar na tabela tb_aditivos se o id_obra é igual ao cadastrado.

Basicamente o que eu tenho que fazer é pegar o campo QtdTempo no tb_aditivos e somar DataTermino na tabela tb_obras.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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