Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
eu tenho uma tabela assim
usuario / valor
pedro / 0,50
joao / 0,50
maria / 50,00
carlos / 300,00
marcos / 200,00
paulo / 49,00
eu quero que 100,00 então vai somar os valores em ORDEM CRESCENTE e vai me mostrar por exemplo:
pedro / 0,50
joao / 0,50
maria / 50,00
paulo / 49,00
total: 100,00
se poder ajudar agradeço
>
8 horas atrás, ESerra disse:
Você não especificou o SGBD, então vou partir para a resolução do lado da aplicação.
O modo mais simples é a cada volta do laço somar o valor total já apresentado e caso passe do especificado dar um break no laço.
$sql = $con->prepare("SELECT * FROM tabela ORDER BY valor ASC");
$sql->execute();
$valor_final = 100;
$valor_atual = 0;
while($lista = $sql->fetch(PDO::FETCH_ASSOC)){
$valor_atual += $lista['valor'];
if($valor_atual >= $valor_final){
break;
}
}
Entendi, Beleza daqui pouco vou testar, eu fiz da mesma forma só não fiz o tal do laço>
20 horas atrás, ESerra disse:
Você não especificou o SGBD, então vou partir para a resolução do lado da aplicação.
O modo mais simples é a cada volta do laço somar o valor total já apresentado e caso passe do especificado dar um break no laço.
$sql = $con->prepare("SELECT * FROM tabela ORDER BY valor ASC");
$sql->execute();
$valor_final = 100;
$valor_atual = 0;
while($lista = $sql->fetch(PDO::FETCH_ASSOC)){
$valor_atual += $lista['valor'];
if($valor_atual >= $valor_final){
break;
}
}
Dessa forma esta me mostrando o pedro e o joao Valor: 0.50 porque será>
20 horas atrás, ESerra disse:
$sql = $con->prepare("SELECT * FROM tabela ORDER BY valor ASC");
$sql->execute();
$valor_final = 100;
$valor_atual = 0;
while($lista = $sql->fetch(PDO::FETCH_ASSOC)){
$valor_atual += $lista['valor']; // aqui esta me mostrando 202
if($valor_atual >= $valor_final){
echo $lista['id'].' '.$lista['usuario'].' '.$lista['valor'].'<br>';
// aqui ele da break só ID 5 marcos: 200.00
break;
}
echo $lista['id'].' '.$lista['usuario'].' '.$lista['valor'].'<br>';
// aqui ele me mostra ID 1 pedro valor: 0.50
//e o ID 2 joao valor: 0.50
}
FICOU dessa forma porque será$sql = $con->prepare("SELECT * FROM fila ORDER BY valor ASC");
$sql->execute();
$valor_final = 100;
while($lista = $sql->fetch(PDO::FETCH_ASSOC)){
foreach ( array($lista['valor'].',') as $n ) {
if ( $n > $valor_final ) {
break;
}
echo $lista['usuario'].' '.$lista['valor'].'<br>';
}
}
fiz dessa forma funcionou perfeitamente
pedro 0.50
joao 0.50
paulo 49.00
maria 50.00
só que se eu aumentar o valor da maria para 70.00 ainda continua aparecendo
tinha que sumirErro de lógica, se você quer o somatório dos valores, você tem que somar e testar, você está apenas testando o valor de cada usuário em separado.
$sql = $con->prepare("SELECT * FROM fila ORDER BY valor ASC");
$sql->execute();
$valor_final = 100;
$valor_atual = 0;
while($lista = $sql->fetch(PDO::FETCH_ASSOC)){
foreach ( array($lista['valor'].',') as $n ) {
$valor_atual += $n;
if ( $valor_atual <= $valor_final ) {
echo $lista['usuario'].' '.$lista['valor'].'<br>';
}else{
break;
}
}
}>
1 hora atrás, ESerra disse:
Erro de lógica, se você quer o somatório dos valores, você tem que somar e testar, você está apenas testando o valor de cada usuário em separado.
$sql = $con->prepare("SELECT * FROM fila ORDER BY valor ASC");
$sql->execute();
$valor_final = 100;
$valor_atual = 0;
while($lista = $sql->fetch(PDO::FETCH_ASSOC)){
foreach ( array($lista['valor'].',') as $n ) {
$valor_atual += $n;
if ( $valor_atual <= $valor_final ) {
echo $lista['usuario'].' '.$lista['valor'].'<br>';
}else{
break;
}
}
}
dessa forma continua me mostrando só
pedro 0.50
joao 0.50$sql = $con->prepare("SELECT * FROM fila ORDER BY valor ASC");
$sql->execute();
$valor_final = 100.00;
$valor_atual = 0.00;
while($lista = $sql->fetch(PDO::FETCH_ASSOC)){
foreach ( array($lista['valor'].',') as $n ) {
if ( $n > $valor_final ) {
break;
}
$valor_atual += $n;
if($valor_atual <= $valor_final){
echo $lista['usuario'].' '.$lista['valor'].'<br>';
} else {
break;
}
}
}
fiz dessa forma funcionou perfeitamente
pedro 0.50
joao 0.50
paulo 49.00
maria 50.00
se eu trocar o valor da maria 70,00 some agora
mais por exemplo:
pedro / 0.50
joao / 0.50
maria / 50.00
carlos / 300.00
marcos / 200.00
paulo / 49.00
seu eu troco o valor do carlos para 10.00
me mostra
pedro / 0.50
joao / 0.50
carlos / 10.00
paulo / 49.00
pula 50.00 que é a maria
no caso eu não posso ordenar os valores no select
tirei o order by valor asc
pedro 0.50
joao 0.50
maria 50.00
carlos 10.00
acho que agora ficou melhor, será que fica correto dessa forma esta correta ou tem muita gambiarra kkk, agradeço pela ajuda esse negocio estava dando um nó na cabeça kk
Você não especificou o SGBD, então vou partir para a resolução do lado da aplicação.
O modo mais simples é a cada volta do laço somar o valor total já apresentado e caso passe do especificado dar um break no laço.