xnando 0 Denunciar post Postado Março 20, 2013 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
William Bruno 1501 Denunciar post Postado Março 20, 2013 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
xnando 0 Denunciar post Postado Março 20, 2013 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
Marcos Xavier 189 Denunciar post Postado Março 20, 2013 E se usar SUM. https://www.google.com/webhp?hl=pt-PT&tab=ww#hl=pt-PT&gs_rn=7&gs_ri=psy-ab&cp=16&gs_id=6&xhr=t&q=mysql+select+sum&es_nrs=true&pf=p&output=search&sclient=psy-ab&oq=mysql+select+sum&gs_l=&pbx=1&bav=on.2,or.r_qf.&bvm=bv.44011176,d.eWU&fp=b923f6c24a931af8&biw=1024&bih=626 Compartilhar este post Link para o post Compartilhar em outros sites
xnando 0 Denunciar post Postado Março 20, 2013 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
Marcos Xavier 189 Denunciar post Postado Março 20, 2013 Dá uma lida nesse tópico http://forum.imasters.com.br/topic/489359-contar-valores-iguais-de-varias-colunas Compartilhar este post Link para o post Compartilhar em outros sites
xnando 0 Denunciar post Postado Março 20, 2013 Muito brigado Marcos e Bruno, consegui resolver com SUM o problema, ambos me ajudaram muito. Valeu! Compartilhar este post Link para o post Compartilhar em outros sites