MySQL从单独的表中获取求和值

时间:2019-03-12 04:26:00

标签: mysql

地区

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

cuisine_promotions

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个单独的查询?

2 个答案:

答案 0 :(得分:2)

我将其写为子查询之间的一系列联接,每个子查询都会进行汇总以找到一定的收入金额。

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

答案 1 :(得分:2)

@TimBiegeleisen您在时间上击败了我:)...正在处理查询,但是当我刷新页面时,您看到您已经答复了……很棒的工作...! 顺便说一句,我为此编写了以下查询。...

SELECT r.name Region, IFNULL(ba.fee, 0) banner_revenue, IFNULL(cp.fee, 0) cuisine_revenue, IFNULL(sp.fee, 0) promotions_revenue, (IFNULL(ba.fee, 0) + IFNULL(cp.fee, 0) + IFNULL(sp.fee, 0)) total
FROM regions r 
	LEFT JOIN (SELECT SUM(sp.fee) fee, re.region_id FROM sponsored_promotions as sp INNER JOIN restaunts as re ON re.id = sp.restaurant_id GROUP BY re.region_id) sp ON r.id=sp.region_id
    LEFT JOIN (SELECT IFNULL(SUM(fee),0) fee, region_id FROM `cuisine_promotions` GROUP BY region_id) cp ON r.id=cp.region_id
    LEFT JOIN (SELECT IFNULL(SUM(fee),0) fee, region_id FROM `banner_ads` GROUP BY region_id) ba ON r.id=ba.region_id

相关问题