地区
id | name
---+---------
1 | NY
2 | Paris
3 | London
餐厅
id | name | region_id
---+-----------+----------
1 | kFC |1
2 | McDonalds |2
banner_ads
id | image | fee | region_id
---+-------+------+-----------
1 |1.jpg |500 | 1
2 |2.jpg |500 | 1
3 |3.jpg |500 | 2
4 |4.jpg |500 | 3
美食促销
id | cuisine_id | fee | region_id
---+------------+------+-----------
1 |1 |500 | 1
2 |2 |500 | 1
3 |3 |500 | 2
4 |4 |500 | 3
sponsored_promotions
id | item_id | fee | restaurant_id
---+---------+------+--------------
1 |1 |500 | 1
2 |2 |500 | 1
3 |3 |500 | 2
4 |4 |500 | 2
我想向这个表中填充数据
region | banner_revenue | cuisine revenue | promotions_revenue | total
-------+----------------+-----------------+--------------------+--------
NY | 1000 | 1000 | 1000 | 3000
Paris | 500 | 500 | 1000 | 2000
London | 500 | 500 | null | 1000
我可以做这样的事
SELECT sum(fee) FROM test2.banner_ads;
SELECT sum(fee) FROM test2.cuisine_promotions;
SELECT
regions.name,
SUM(sponsored_promotions.fee)
FROM
test2.sponsored_promotions
INNER JOIN
restaurants ON sponsored_promotions.restaurant_id = restaurants.id
INNER JOIN
regions ON restaurants.region_id = regions.id
GROUP BY
regions.name;
并将以上三个值相加得到总数。
但我正在寻找更优雅的方式来做到这一点。
是否可以在单个查询中执行此操作?没有 3 个单独的查询?
最佳答案
我会把它写成子查询之间的一系列连接,每个子查询都会进行聚合以找到特定的收入金额。
SELECT
r.name,
COALESCE(b.banner_revenue, 0) AS banner_revenue,
COALESCE(c.cuisine_revenue, 0) AS cuisine_revenue,
COALESCE(p.promotions_revenue, 0) AS promotions_revenue,
COALESCE(b.banner_revenue, 0) + COALESCE(c.cuisine_revenue, 0) +
COALESCE(p.promotions_revenue, 0) AS total
FROM regions r
LEFT JOIN
(
SELECT region_id, SUM(fee) AS banner_revenue
FROM banner_ads
GROUP BY region_id
) b
ON r.id = b.region_id
LEFT JOIN
(
SELECT region_id, SUM(fee) AS cuisine_revenue
FROM cuisine_promotions
GROUP BY region_id
) c
ON r.id = c.region_id
LEFT JOIN
(
SELECT r.region_id, SUM(s.fee) AS promotions_revenue
FROM restaunts r
INNER JOIN sponsored_promotions s
ON r.id = s.restaurant_id
GROUP BY r.region_id
) p
ON r.id = p.region_id;
按照下面的演示链接查看查询是否正确处理您的数据。
Demo
关于MySQL从单独的表中获取求和值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55114151/