如何避免计算由 SUM() 内部的连接引起的行?

Posted

技术标签:

【中文标题】如何避免计算由 SUM() 内部的连接引起的行?【英文标题】:How to avoid calculating rows caused by the join inside SUM()? 【发布时间】:2021-11-14 01:28:10 【问题描述】:

这是我的数据库架构简化:

// wallet
+----+--------+---------+
| id | credit | user_id |
+----+--------+---------+
| 1  | 1000   | 1       |
| 2  | 1500   | 2       |
+----+--------+---------+

// where_to_pay_ability
+----+-------------+-----------+
| id | business_id | wallet_id |
+----+-------------+-----------+
| 1  | 5           | 1         |
| 2  | 4           | 1         |
+----+-------------+-----------+

这是我当前的查询:

select sum(credit)
from wallet w 
left join where_to_pay_ability wtpa on w.id = wtpa.wallet_id
where user_id = 1

返回2000。因为where_to_pay_ability 表中有两行。这对我来说是一个错误的信用。我想在wallet 表中使用一次sum 行。所以,预期的结果是1000

我该怎么做?


需要注意的是,我可以通过GROUP BYed wallet_id(或DISTINCT)的子查询来做到这一点left join。但是,我需要那些business_ids。

所以,我需要在SUM() 中添加一个条件,以避免计算由连接引起的行。

【问题讨论】:

如果您不访问其他表中的任何数据,为什么不删除JOIN 好吧@NicoHaase,正如我所说,这是我想要的简化版本.. 实际上,我需要从walletwhere_to_pay_ability 表中选择所有列。 【参考方案1】:

您需要加入之前聚合:

select sum(credit)
from wallet w left join
     (select wtpa.wallet_id, count(*) as cnt
      from where_to_pay_ability wtpa
      group by wtpa.wallet_id
     ) wtpa
     on w.id = wtpa.wallet_id;
 where user_id = 1;

不过,在您的特定示例中,您可以使用 max(),因为只有一行。

【讨论】:

以上是关于如何避免计算由 SUM() 内部的连接引起的行?的主要内容,如果未能解决你的问题,请参考以下文章

如何避免由 Friend 属性引起的间接引用?

如何屏蔽rs232针脚17未连接引起的告警

计算机系统漫游

如何避免内部类中的内存泄漏

如果它们具有相同的行数,如何根据 order_id 内部连接表

如何在 C# 中按小时格式(120:15:10)的行求和/分组,如 SQL - SELECT SUM (col1), col 2, col3 GROUP BY col2, col3