我在生成一个在我所处的情况下工作的查询时遇到了一些困难。以下是详细信息......
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
但是在原始示例中,它并不总是拉出正确的值?
答案 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