Mysql join和sum是加倍的结果

Ars*_*Ali 7 mysql sql join group-by aggregate-functions

我有一张收入表

title_id     revenue    cost
   1            10        5
   2            10        5
   3            10        5
   4            10        5
   1            20        6                    
   2            20        6
   3            20        6
   4            20        6
Run Code Online (Sandbox Code Playgroud)

当我执行此查询

SELECT SUM(revenue),SUM(cost)
FROM revenue
GROUP BY revenue.title_id
Run Code Online (Sandbox Code Playgroud)

它会产生结果

title_id     revenue    cost
   1            30        11
   2            30        11
   3            30        11
   4            30        11
Run Code Online (Sandbox Code Playgroud)

这是好的,现在我想将sum结果与另一个具有这样结构的表结合起来

title_id     interest    
   1            10        
   2            10        
   3            10        
   4            10        
   1            20                            
   2            20        
   3            20        
   4            20        
Run Code Online (Sandbox Code Playgroud)

当我用这样的聚合函数执行连接时

SELECT SUM(revenue),SUM(cost),SUM(interest)
FROM revenue
LEFT JOIN fund ON revenue.title_id = fund.title_id
GROUP BY revenue.title_id,fund.title_id      
Run Code Online (Sandbox Code Playgroud)

结果加倍

title_id     revenue    cost    interest
   1            60        22       60
   2            60        22       60
   3            60        22       60
   4            60        22       60
Run Code Online (Sandbox Code Playgroud)

我不明白为什么它加倍,请帮忙

Con*_*rix 13

它加倍,因为你在基金和收入表中重复了头衔.这会使匹配的记录数倍增.如果删除聚合函数并查看原始数据,则很容易看到.看这里

解决此问题的方法是创建聚合的内联视图并加入这些结果.

SELECT R.title_id, 
       R.revenue, 
       R.cost, 
       F.interest 
FROM   (SELECT title_id, 
               Sum(revenue) revenue, 
               Sum(cost)    cost 
        FROM   revenue 
        GROUP  BY revenue.title_id) r 
       LEFT JOIN (SELECT title_id, 
                         Sum(interest) interest 
                  FROM   fund 
                  GROUP  BY title_id) f 
              ON r.title_id = F.title_id 
Run Code Online (Sandbox Code Playgroud)

产量

| TITLE_ID | REVENUE | COST | INTEREST |
----------------------------------------
|        1 |      30 |   11 |       30 |
|        2 |      30 |   11 |       30 |
|        3 |      30 |   11 |       30 |
|        4 |      30 |   11 |       30 |
Run Code Online (Sandbox Code Playgroud)

演示