我正在计算用户的收入,以便它反映在用户主页上,以便他们知道自己的推荐人的收入。
这是我的密码。
$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
,因为UNION
0消除了结果集中的重复项。这就是为什么得到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;
}