首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL和两列(1 -> n)

MySQL和两列(1 -> n)
EN

Stack Overflow用户
提问于 2020-09-19 01:49:18
回答 2查看 307关注 0票数 0

我有一个具有字段ID和Foreign events_id以及字段total_value的表“租金”,另一个表“payments”具有字段ID、外键_id和字段E 110支付<代码>E 211。

表事件:

代码语言:javascript
运行
复制
ID

表租金:

代码语言:javascript
运行
复制
ID,
total_value,
events_id 

表支付:

代码语言:javascript
运行
复制
ID,
payment,
rents_id

对于相同的租金ID表有很多支付,对于相同的事件ID表也有很多租金。我需要创建一个查询,该查询显示字段“total_value”的sum(),该字段的租金表中具有相同的事件ID,而字段“payment”中的sum()显示相同的租金ID。

我已经成功地创建了这个查询来完成这个任务:

代码语言:javascript
运行
复制
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
;

我想知道这是唯一的方法,还是有更好的方法去做?

EN

回答 2

Stack Overflow用户

发布于 2020-09-19 02:00:24

我建议使用一个join --它的思想是先在子查询中计算中间支付金额,然后再在外部查询中进行连接和聚合。

代码语言:javascript
运行
复制
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生成结果:

代码语言:javascript
运行
复制
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
票数 2
EN

Stack Overflow用户

发布于 2020-09-19 12:36:18

关联子查询可能是最好的方法(我将在后面解释)。但是,您不需要在子查询中使用join,只需要一个关联子句:

代码语言:javascript
运行
复制
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)上的索引,这应该是最快的方法。

其次,请注意,在查询中只包含了一次筛选条件。这使得更新查询变得容易,并且不易出错。

第三,这并不是预先汇总付款表.预聚合要么需要重复过滤条件(如查询的版本),要么需要聚合超过必要的数据(这会影响性能)。

此外,我建议您不要在列别名中使用单引号。仅对字符串和日期常量使用单引号。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63964539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档