我有一个具有字段ID和Foreign events_id以及字段total_value的表“租金”,另一个表“payments”具有字段ID、外键_id和字段E 110
支付<代码>E 211。
表事件:
ID
表租金:
ID,
total_value,
events_id
表支付:
ID,
payment,
rents_id
对于相同的租金ID表有很多支付,对于相同的事件ID表也有很多租金。我需要创建一个查询,该查询显示字段“total_value”的sum(),该字段的租金表中具有相同的事件ID,而字段“payment”中的sum()显示相同的租金ID。
我已经成功地创建了这个查询来完成这个任务:
SELECT SUM(r.total_value) 'Total Value', (SELECT SUM(p.payment) FROM payments p INNER JOIN rents r ON p.rents_id = r.id WHERE r.events_id=8) 'Total Payment'
FROM rents r
WHERE r.events_id=8
;
我想知道这是唯一的方法,还是有更好的方法去做?
发布于 2020-09-19 02:00:24
我建议使用一个join --它的思想是先在子查询中计算中间支付金额,然后再在外部查询中进行连接和聚合。
select sum(r.total_value) total_value, sum(p.payment) total_payment
from rents r
left join (
select rents_id, sum(payment) payment from payments group by rents_id
) p on p.rents_id = r.id
where r.events_id = 8
left join
避免将根本没有支付的租金过滤掉。
您可以轻松地更改查询以同时为所有event_id
生成结果:
select r.events_id, sum(r.total_value) total_value, sum(p.payment) total_payment
from rents r
left join (
select rents_id, sum(payment) payment from payments group by rents_id
) p on p.rents_id = r.id
group by r.events_id
发布于 2020-09-19 12:36:18
关联子查询可能是最好的方法(我将在后面解释)。但是,您不需要在子查询中使用join
,只需要一个关联子句:
SELECT SUM(r.total_value) as Total_Value,
(SELECT SUM(p.payment)
FROM payments p
WHERE p.rents_id = r.id
--------------^ correlation clause that "links" the subquery to the outer query
) as Total_Payment
FROM rents r
WHERE r.events_id = 8;
为什么这是最好的方法?首先,使用payments(rents_id)
和rests(events_id)
上的索引,这应该是最快的方法。
其次,请注意,在查询中只包含了一次筛选条件。这使得更新查询变得容易,并且不易出错。
第三,这并不是预先汇总付款表.预聚合要么需要重复过滤条件(如查询的版本),要么需要聚合超过必要的数据(这会影响性能)。
此外,我建议您不要在列别名中使用单引号。仅对字符串和日期常量使用单引号。
https://stackoverflow.com/questions/63964539
复制相似问题