正在使用UNION查询获取while语句中的total


Getting total in while statement with UNION query

我正在计算用户的收入,以便它反映在用户主页上,以便他们知道自己的推荐人的收入。

这是我的密码。

$get_ref_stats = $db->query("SELECT * FROM `members` WHERE `referral` = '".$user_info['username']."'");
$total_cash = 0;
    while($ref_stats = $get_ref_stats->fetch_assoc()){
        $get_ref_cash = $db->query("SELECT * FROM `completed` WHERE `user` = '".$ref_stats['username']."' UNION SELECT * FROM `completed_repeat` WHERE `user` = '".$ref_stats['username']."'");
        $countr_cash = $get_ref_cash->fetch_assoc();
        $total_cash += $countr_cash['cash'];
        $countr_c_rate = $setting_info['ref_rate'] * 0.01;
        $total_cash = $total_cash * $countr_c_rate;
    }

我刚做的时候效果很好

$get_ref_cash = $db->query("SELECT * FROM `completed` WHERE `user` = '".$ref_stats['username']."'");

但一旦我在CCD_ 1中添加,它就不再正确计算。例如,completed中有1个条目,completed_repeat中有一个条目,这两个条目的cash条目都为0.75。$countr_c_rate的变量为0.10,因此$total_cash应等于0.15,但在有和没有UNION的情况下,它显示为0.075,就好像它也没有从另一个表中计数一样。

我希望这是有道理的,因为我不知道如何解释这个问题,但我不确定我在这里做错了什么。

在第二个查询中,您应该使用UNION ALL而不是UNION,因为UNION0消除了结果集中的重复项。这就是为什么得到0.075而不是0.15的原因。

现在,与其从客户端代码多次访问数据库,不如在一个查询中计算您的现金总额。

如果没有看到您的表结构和样本数据,它可能是不准确的,但这个查询可能看起来像这个

SELECT SUM(cash) cash_total
  FROM
(
    SELECT c.cash 
      FROM completed c JOIN members m
        ON c.user = m.username
     WHERE m.referral = ?
     UNION ALL 
    SELECT r.cash 
      FROM completed_repeat r JOIN members m
        ON r.user = m.username
     WHERE m.referral = ?
) q

如果没有准备好的语句,您的php代码可能看起来像

$sql = "SELECT SUM(cash) cash_total
  FROM
(
    SELECT c.cash
      FROM completed c JOIN members m
        ON c.user = m.username
     WHERE m.referral = '$user_info['username']'
     UNION ALL 
    SELECT r.cash 
      FROM completed_repeat r JOIN members m
        ON r.user = m.username
     WHERE m.referral = '$user_info['username']'
) q";
$result = $db->query($sql);
if(!$result) {
    die($db->error()); // TODO: better error handling
}
if ($row = $result->fetch_assoc()) {
    $total_cash = $row['cash_total'] * $setting_info['ref_rate'];
}

附带说明:在mysqli中使用准备好的语句,而不是使用串联构建查询。它容易受到sql注入的攻击

使用$countr_cash = $get_ref_cash->fetch_assoc();,您只获取结果的第一行。但是,如果您使用UNION,那么在您的情况下会得到两行。

因此,您需要对所有行进行迭代,以便获得所有值。

好的,所以members表中只有一行。您只在成员表上迭代一次。然后尝试使用UNION子句获取行,这将导致两行而不是一行。然后,您只需要获得第一行的cash列,并将其添加到$total_cash变量中。

您需要做的是对通过执行UNION查询获得的结果进行迭代,并添加$total_cash变量。这将给你所需的结果。

$get_ref_stats = $db->query("SELECT * FROM `members` WHERE `referral` =  '".$user_info['username']."'");
$total_cash = 0;
while($ref_stats = $get_ref_stats->fetch_assoc()){
    $get_ref_cash = $db->query("SELECT * FROM `completed` WHERE `user` = '".$ref_stats['username']."' UNION SELECT * FROM `completed_repeat` WHERE `user` = '".$ref_stats['username']."'");
    while($countr_cash = $get_ref_cash->fetch_assoc()){
        $total_cash += $countr_cash['cash'];
    }
    $countr_c_rate = $setting_info['ref_rate'] * 0.01;
    $total_cash = $total_cash * $countr_c_rate;
}