将内连接与 sum 一起使用时出现问题
Posted
技术标签:
【中文标题】将内连接与 sum 一起使用时出现问题【英文标题】:Issue while using inner join with sum 【发布时间】:2019-02-26 01:00:48 【问题描述】:我有两 (2) 张桌子: ps_wk_mp_seller_transaction_history
还有 ps_wk_mp_seller_order_status
仅当 current_state = 5
时,我才想合计 seller_amount为此我写了这个:
select sum(seller_amount) as seller_amount
from ps_wk_mp_seller_transaction_history th inner join
ps_wk_mp_seller_order_status os
on os.id_order = th.id_transaction and
os.current_state = 5 and
th.id_customer_seller = 2;
对于 id_customer_seller=2,我得到这个 4984.020000 (4950+34.02),它是准确的
但是对于 id_customer_seller=5,我得到 25.848000 而不是 NULL
有人可以帮我吗?
也许你可以自己测试一下,代码是:https://github.com/kulturman/fakerepo
【问题讨论】:
ON
子句的最后一个谓词and th.id_customer_seller=?
应该过滤掉id_customer_seller=5
的所有记录。因此,在这种情况下,我看不出你怎么可能得到25.848
。你能设置一个模型来演示你的问题吗?
也许你可以自己测试一下,这个代码:github.com/kulturman/fakerepo
您的 dB 设计看起来有缺陷,或者至少无法达到您想要的效果。运行查询,在其中选择 * 并且仅加入 id_order 和 id_transaction,您将获得六行,涵盖卖方和状态的所有组合,这意味着您永远不会从原始查询中获得空值,因为至少会为任何行选择一个组合状态和卖方的有效组合
您的问题暗示您期望第一个订单状态行与前两个交易行关联,第二个订单状态要关联到最后一个事务行的行。但是,您的查询将 both 订单状态行与所有三个交易行相关联。 (就像@JoakimDanielson 所说,这会产生 6 种组合。) 所以,我的问题是 为什么 你认为 只有 第二个订单状态行关联到最后一个交易行? (这是我可以看到您期望结果为 NULL 的唯一方法。)
他的问题是 id_transaction
与 current_state 5 和 14 相同,这就是为什么 id_customer_seller
不会为空
【参考方案1】:
首先,您的记录有一些逻辑问题,id_transaction
有两个交易,id_transaction
相同,但金额不同,state
不同!所以 id 41
的交易有状态 5
以及为什么客户 5
不会为空,因为 41 处于状态 5。
解决这个问题
每笔交易的交易id必须是唯一的,以便区分交易状态和金额
查询应该是这样的
select sum(seller_amount) as seller_amount
from ps_wk_mp_seller_transaction_history th
left join ps_wk_mp_seller_order_status os
on os.id_order=th.id_transaction
where
th.id_customer_seller = 2
and os.current_state=5
工作示例here
【讨论】:
OP 的问题源于查询id_customer_seller=5
并且他/她期望 NULL
。但是你的观点是正确的,id_transaction
涵盖了两个卖家的os.current_state=5
。
感谢您的回答,但架构不是我的。我正在尝试自定义 prestashop 第三方模块。这是一个市场,当客户下订单包含两个卖家的产品时,模块将创建两个“ps_wk_mp_seller_order_status”行。你明白我的意思吗?以上是关于将内连接与 sum 一起使用时出现问题的主要内容,如果未能解决你的问题,请参考以下文章
将 DAX 与 DynamoDB 一起使用时出现无法配置集群端点错误
使用 JDBC 获取与 MySQL 的连接时出现“连接过多”
EasyGBS与上级级联时出现contact内ip不符的处理方法