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 个表上查询总和的主要内容,如果未能解决你的问题,请参考以下文章
查询从 3 个表中获取数据,主表和总和列从彼此 2 个表中获取