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

标签 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

美食促销

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/

相关文章:

mysql - 消除mysql中的空值

mysql,只返回大于10000的结果

mysql - 查找最近3天的mysql记录

php - 查询 Laravel 查询生成器

mysql - 从 MySQL 的 IP 范围中选择 CIDR

sql - 如何确保 mysql 表中没有重复项?

PHP MySQLi 转义引号

mysql - 从 Docker 卷恢复 mysql 数据

mysql - MySQL中多个表的总分总和

mysql - 如何根据每个用户给定的记录集获取最后 5 或 6 条记录