mysql 在 2 个表上查询总和

Posted

技术标签:

【中文标题】mysql 在 2 个表上查询总和【英文标题】:mysql query on 2 tables with sum 【发布时间】:2012-09-22 00:30:39 【问题描述】:

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

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

billing = 基本上在生成发票时,它会使用主键、发票 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

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

【问题讨论】:

你能显示示例数据和预期结果吗? 尝试使用连接而不是左连接(只是为了确认输出)然后检查,我认为空值可能会导致问题 结果如下... id_999333/263/john smith/250/300/-50 当只使用连接而不是左连接时,我确实得到了更多的结果,但它们彼此一致,各行中的原始值保持不变。 结果如下... id_999333/263/john smith/250/300/-50 应该是 id_999333/263/john smith/250/150/100 【参考方案1】:

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

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

假设您有表 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 来测试它。

【讨论】:

我希望它在数据库中查看并提取每张发票,将保管费相加并保留它以进行计算,以从另一个表字段的总和中减去。 更新了上面的答案。您的加入为您提供的记录比您想象的要多,因此您的总和是错误的。 你是绝对正确的。我确实对其进行了调整,它可以根据需要工作。当我研究你是如何想出这个的时,我会在哪里放置一个 where 子句,比如'invoicedate 这是一个三步过程。 1. 从计费表中获取总和(连接左侧的缩进 SELECT)。 2. 从 billing_dates 表中获取总和(连接右侧的缩进 SELECT)。 3. 在 id 上加入结果并计算总和的差异(未缩进的外部 SELECT)。所以一个新的 where 子句应该放在任何有意义的步骤中。 现在我明白了,很好。感谢您的解释,再次感谢您的时间和知识。【参考方案2】:

$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

【讨论】:

确实给出了不同的结果,但仅在总字段中,由于某种原因,我在 finaltotal 和paidtotal 字段中得到了不正确的值。例如,我在 john smith 的帐单表中有 3 张单独的发票。 3 个金额是 100,100,100,但保管打印出 5261.13 - 但是...有些行是正确的,无法弄清楚原因 你能显示样本数据和预期结果吗? (对于每个表。)如果你可以显示这样的数据 ***.com/questions/10974525/… 会更容易得到一个想法。 也许我很困惑,它们显示为 finaltotal 和 paytotal。 我意识到paidtotal 和 finaltotal 中的值正在成倍增加。几乎就像我需要一个明确的总和? finaltotal 值包含 billing.custotal 的总和。所以我喜欢看到这些 billing.custotal 数据没有总和。

以上是关于mysql 在 2 个表上查询总和的主要内容,如果未能解决你的问题,请参考以下文章

MySQL JOIN 2 个表并分别获取两个表的总和

查询从 3 个表中获取数据,主表和总和列从彼此 2 个表中获取

具有多个表的联结表上的 MySQL SELECT 查询

使用 Django ORM 注释查询以计算 2 个表值的总和

在 3 个大表上使用内连接优化 SQL 查询

在具有数百万条记录的 2 个表上加入更快