带有sum的2个表的mysql查询

时间:2012-10-01 06:36:55

标签: php mysql sql

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

1表=结算
1表=结算日期

结算=基本上在生成发票时,它会在结算中创建一行,其中包含主键,发票ID,用户ID,用户用户名,实际名称,发票日期,发票总额和付款由

结算日期=在对发票付款时,它会在结算日期创建一行,其中包含主键,ID(与结算表中的主键相同),发票ID(与帐单中的帐单ID,用户ID(与结算中的用户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

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

2 个答案:

答案 0 :(得分:1)

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

因此,据推测,任何一个表都可以为每个login_id创建多个记录,这就是为什么要进行求和和分组的原因。但是,看看你的查询在你拿出聚合和小组的时候给你的回复,我想你可能会理解这个问题。

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

e.g。

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来测试它。

答案 1 :(得分: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