1

我正在尝试计算用户的收入,以便它反映在用户主页上,以便他们知道他们的推荐人赚取了多少。

这是我的代码。

$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']."'");

但是一旦我添加它,UNION它就不再正确计算了。例如,有 1个条目,这两个条目中的completed1个条目的条目为 0.75。for 的变量是 0.10,所以应该等于 0.15,但它显示为 0.075,有和没有,它的行为就好像它没有从另一个表中计数一样。completed_repeatcash$countr_c_rate$total_cashUNION

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

4

3 回答 3

2

在您的第二个查询中,UNION您应该使用UNION ALL因为UNION消除了结果集中的重复项。这就是为什么你得到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 注入的影响。

于 2013-06-23T03:36:43.393 回答
1

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

因此,您需要遍历所有行以获取所有值。

于 2013-06-23T03:25:51.080 回答
1

好的,所以表中只有一行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;
}
于 2013-06-23T03:28:56.140 回答