2

我在生成适用于我所处情况的查询时遇到了一些困难。以下是详细信息...

1 表 = 计费
1 表 = 计费日期

billing = 基本上在生成发票时,它会在计费中创建一行,其中包含主键、发票 ID、用户 ID、用户用户名、他们的实际姓名、发票日期、发票总额和付款

计费日期 = 当对发票进行付款时,它会在计费日期中创建一行,其中包含一个主键、一个 id(与计费表中的主键相同)、一个发票 id(与billing), 用户 id (与 billing 中的用户 id 相同), 支付日期, 支付金额

我正在尝试创建一个帐龄报告,该报告将提取每张未结发票并将其显示在 PHP 中的 30/60/90/90+ 表中给最终用户。因此,如果发票 #12 上有 100 美元的余额,以及两次 10 美元的付款,并且发票已有 60 天的历史,它将在报告中显示此信息。这是我所拥有的...

 $sql17 = "SELECT 
 $mysql_billing.login_id, $mysql_billing.primary_key, $mysql_billing.a_name,
 SUM($mysql_billing.custotal) AS finaltotal,
 SUM($mysql_billing_dates.amount) AS paidtotal,
 $mysql_billing.custotal - $mysql_billing_dates.amount AS total
 FROM $mysql_billing
 LEFT JOIN $mysql_billing_dates ON $mysql_billing.login_id = $mysql_billing_dates.login_id
 GROUP BY login_id
 ORDER BY a_name ASC";

当我运行它时,有些是正确的,而大多数不是。我无法弄清楚不一致是什么。任何想法将不胜感激,也许我走错了路? 更多
当我执行以下操作时,正确的值会显示...

 SELECT 
 $mysql_billing.login_id, $mysql_billing.primary_key, $mysql_billing.a_name,
 SUM($mysql_billing.custotal) AS finaltotal
 FROM $mysql_billing
 GROUP BY login_id
 ORDER BY a_name ASC

但在原始示例中,它并不总是拉出正确的值?

4

2 回答 2

1

好的,我相信我明白发生了什么。

因此,大概每个表中的每个 login_id 都可以有多个记录,这就是您要进行 sum 和 group by 的原因。但是,当您取出聚合和分组依据时,看看您的查询给您带来了什么,我想您可能会理解这个问题。

假设您有表 1,其中有 2 条记录用于 login_id xxx1234,表 2 有 3 条记录用于该 login_id。然后,当您离开时加入他们,您将获得6 条记录

例如

table 1:
  login, custotal
  xxx111, 10
  xxx111, 20

table 2:
  login, amount
  xxx111, 30
  xxx111, 40
  xxx111, 50

after the join:
  login, custotal, amount
  xxx111 10, 30
  xxx111 10, 40
  xxx111 10, 50
  xxx111 20, 30
  xxx111 20, 40
  xxx111 20, 50

因此,您可能会获得数倍于您预期金额的金额。

相反,您想要做的是这样的:

 SELECT 
 billing_totals.login_id, billing_totals.primary_key, billing_totals.a_name, 
 billing_totals.finaltotal,
 billing_dates_totals.paidtotal,
 (billing_totals.finaltotal - billing_dates_totals.paidtotal) AS total
 FROM
   (SELECT $mysql_billing.login_id, 
   $mysql_billing.primary_key, 
   $mysql_billing.a_name, 
   SUM($mysql_billing.custotal) AS finaltotal 
   FROM $mysql_billing GROUP BY login_id) billing_totals 
 LEFT JOIN 
   (SELECT $mysql_billing_dates.login_id, 
   SUM($mysql_billing_dates.amount) AS paidtotal 
   FROM $mysql_billing_dates GROUP BY login_id) billing_dates_totals 
 ON (billing_totals.login_id = billing_dates_totals.login_id) 
 ORDER BY a_name ASC";

可能需要稍微调整一下,因为我目前没有 mysql 来测试它。

于 2012-10-01T06:49:29.320 回答
0

$sql17 = "SELECT $mysql_billing.login_id, $mysql_billing.primary_key, $mysql_billing.a_name, SUM($mysql_billing.custotal) AS finaltotal, SUM($mysql_billing_dates.amount) AS paidtotal, SUM($mysql_billing.custotal) - SUM($mysql_billing_dates.amount) AS total FROM $mysql_billing LEFT JOIN $mysql_billing_dates ON $mysql_billing.login_id = $mysql_billing_dates.login_id GROUP BY login_id ORDER BY a_name ASC";

编辑:我为你尝试了这样的事情。

SELECT a.id, (select sum(custotal) from `billing` where id=a.id) as total1,(select sum(amount) 
from `billing_dates`
where id=a.id) as total1 from `billing` a
于 2012-10-01T06:55:57.267 回答