如何避免计算由 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 BY
ed wallet_id
(或DISTINCT
)的子查询来做到这一点left join
。但是,我需要那些business_id
s。
所以,我需要在SUM()
中添加一个条件,以避免计算由连接引起的行。
【问题讨论】:
如果您不访问其他表中的任何数据,为什么不删除JOIN
?
好吧@NicoHaase,正如我所说,这是我想要的简化版本.. 实际上,我需要从wallet
和where_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() 内部的连接引起的行?的主要内容,如果未能解决你的问题,请参考以下文章
如果它们具有相同的行数,如何根据 order_id 内部连接表
如何在 C# 中按小时格式(120:15:10)的行求和/分组,如 SQL - SELECT SUM (col1), col 2, col3 GROUP BY col2, col3