我有三张 table 。
- 地区
- 美食
- 横幅
如果我运行此查询
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
为什么会发生这种情况? 请引用我的数据库 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/