2011-03-31 185 views
0

我如何计算每个用户在mysql中的百分比?php mysql计算每个百分比

$q = $db->query("SELECT * FROM report LEFT JOIN user ON user.user_id= report.id_user WHERE date='$today' GROUP BY id_user"); 
$q1 = $db->query("SELECT SUM(r_amount) AS total FROM report WHERE date='$today' AND id_user=id_user"); 
$r1 = $q1->fetch_assoc(); 
$totalCharge = $r1['totalCharge']; 
$sixtyPercent = $totalCharge * 0.60; 
$fortyPercent = $totalCharge * 0.40; 

while($r = $q->fetch_array(MYSQLI_ASSOC)) : 
    echo '<tr>'; 
    echo '<td>'.$r['user_name].'</td>'; 
    echo '<td align="center">'.$fortyPercent.'</td>'; 
    echo '<td align="center">'.$sixtyPercent.'</td>'; 
    echo '<td align="center"><strong></strong></td>'; 
    echo '</tr>'; 
endwhile; 


current result: 

name  60% cut 40% cut total 
user 1 60   40   100 
user 2 60   40   100 
user 3 60   40   100 

expecting result: 

name  60% cut 40% cut total 
user 1 60   40   100 
user 2 24   16   40 
user 3 48   32   80 
+2

将值重复放在列中的原因是您要设置$ totalCharge = $ r1 ['totalCharge']并计算出$ 60tyPercent&$ 40yPercent。从那时起,这两个变量是不变的,这会给出你当前结果的行为。 – phaxian 2011-03-31 15:26:48

+0

你为什么一直在计算? – jimy 2011-03-31 15:30:35

+0

@Phaxian:继续,并作为实际回复发布,我很确定这是正确的答案。这些变量应该设置在* while循环中,以便它们改变每个用户。 – 2011-03-31 15:31:11

回答

1

你没有得到预期的结果,因为你$totalCharge变量都不会改变(也永远匹配适当的USER_ID)。

最有可能的是编写一个SQL语句,它结合了您当前拥有的两个语句,然后简单地遍历该语句的结果并执行该循环中的所有计算。

的SQL语句可能看起来像:

SELECT SUM(r_amount) AS totalCharge, report.*, user.* 
FROM report 
JOIN total ON total.id_user = report.id_user 
LEFT JOIN user ON user.user_id= report.id_user 
WHERE date='$today' GROUP BY user_id 

你可能不得不调整它一点点地得到预期的结果。

那么你的循环将类似于:

while($r = $q->fetch_array(MYSQLI_ASSOC)) { 
    $totalCharge = $r['totalCharge']; 
    $sixtyPercent = $totalCharge * 0.60; 
    $fortyPercent = $totalCharge * 0.40; 
    echo '<tr>'; 
    echo '<td>'.$r['user_name'].'</td>';  // corrected syntax error here 
    echo '<td align="center">'.$sixtyPercent.'</td>'; 
    echo '<td align="center">'.$fortyPercent.'</td>'; 
    echo '<td align="center"><strong></strong></td>'; 
    echo '</tr>'; 
} 

希望这将引导您到解决方案。