mysql 二次 聚合_mysql当我加入同一个表两次聚合是错误的

不,这不是MySQL中的错误.

您的JOIN条件正在生成“重复”行. (删除聚合函数和GROUP BY,你会看到发生了什么.

表“a”中的那一行与表“b”中的四行匹配.这一切都很好,很好.但是当您将连接添加到第三个表(“y”)时,从第三个“y”表(两行)返回的每一行都与“b”表中的每一行“匹配”…所以你风结果集中总共有八行. (这就是“total_count”增加一倍的原因.)

要获取您指定的结果集,您不需要第二次加入该表“b”.相反,只需使用条件测试来确定“计数”是否应该包含在“y”总数中.

例如

SELECT a.id,SUM(b.count) AS total_count,SUM(IF(b.date=UTC_DATE()-1,b.count,0)) AS y

FROM a a

LEFT

JOIN b b ON (b.a_id=a.id)

GROUP BY a.id;

请注意,MySQL IF表达式可以替换为等效的ANSI CASE表达式,以提高可移植性:

,SUM(CASE WHEN b.date=UTC_DATE()-1 THEN b.count ELSE 0 END) AS y

如果你确实想第二次联接到那个“b”表,你会希望JOIN条件是这样的,“y”中的一行最多匹配“b”中的一行,以免介绍任何重复.所以你基本上需要连接条件来包含主键中的所有列.

(请注意,表“y”的连接条件中的谓词保证每个来自“y”的匹配不会超过“b”中的一行):

SELECT a.id,SUM(y.count) AS y

FROM a a

LEFT

JOIN b b

ON b.a_id=a.id

LEFT

JOIN b y

ON y.a_id = b.a_id

AND y.b_id = b.b_id

AND y.date = b.date

AND y.date = UTC_DATE()-1

GROUP BY a.id;

(要获得返回相同结果集的第一个语句,使用潜在的NULL代替零,您需要将IF表达式中的’0’常量替换为’NULL’.

,NULL)) AS y

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值