MySQL 获取左连接的总和

标签 mysql left-join

我有三张 table 。

  1. 地区
  2. 美食
  3. 横幅

如果我运行此查询

SELECT SUM(fee) FROM BANNERS;

输出将为 10,000

如果我运行此查询

SELECT SUM(fee) FROM CUISINE;

输出将为 12,800

但是如果我运行这个查询

SELECT REGIONS.name,
sum(BANNERS.fee) as banner_revenue,
sum(CUISINE.fee) as cuisine_revenue
FROM REGIONS
LEFT JOIN BANNERS ON REGIONS.id = BANNERS.region_id
LEFT JOIN CUISINE ON REGIONS.id = CUISINE.region_id
GROUP BY REGIONS.name;

输出错误。我想要的输出是

name    | banner_revenue | cuisine_revenue
------------------------------------------
NY      | 10,000         | 4,800
Paris   | NULL           | 8,000
London  | NULL           | NULL

DB fiddle reproduce

为什么会发生这种情况? 请引用我的数据库 fiddle 。

最佳答案

如果你运行

SELECT *
       FROM REGIONS
            LEFT JOIN BANNERS
                      ON REGIONS.id = BANNERS.region_id
            LEFT JOIN CUISINE
                      ON REGIONS.id = CUISINE.region_id;

您会注意到,对于每个区域横幅对,所有菜肴都会加入,从而“倍增”菜肴。 IE。他们的费用也会成倍增加。

在派生表中进行分组并将它们连接起来以获得您想要的结果。

SELECT r.name,
       sb.fee,
       sc.fee
       FROM REGIONS r
            LEFT JOIN (SELECT sum(b.fee) fee,
                              b.region_id
                              FROM BANNERS b
                              GROUP BY b.region_id) sb
                      ON sb.region_id = r.id
            LEFT JOIN (SELECT sum(c.fee) fee,
                              c.region_id
                              FROM CUISINE c
                              GROUP BY c.region_id) sc
                      ON sc.region_id = r.id;

关于MySQL 获取左连接的总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55512541/

相关文章:

MySQL Max 函数混合行

mysql - JOINing 表同时忽略重复项

mysql - SQL : left join query

MySQL 查询返回的结果多于应有的结果

php - 将数据发布到 mysql DB

mysql - docker 中的巨大静态(mysql)数据库

javascript - Ajax/Javascript - 仅刷新一次

mysql - 如何根据 MySQL 5.5.x 中单独表中的元数据对主表进行排序?

mysql - 慢速 MySQL 左连接查询与中小型数据库

MySQL Query 需要带回行,而不是空结果