MySQL:加入很多:在两个表中选择总和

标签 mysql

我有以下问题。我想在查询中加入一个表。该表有多条记录。现在,我想要主表中一列的总和,以及连接表中一列的总和。这会导致问题,因为主表中列的总和现在不正确(因为我连接到多行)。

| id | date       | campaign_id | sessions |
|----|------------|-------------|----------|
| 1  | 2019-07-01 | 1           | 10       |
| 2  | 2019-07-02 | 1           | 20       |

连接表:

| id | some_var | campaign_id | some_other_metric |
|----|----------|-------------|-------------------|
| 1  | a        | 1           | 100               |
| 2  | b        | 1           | 200               |
| 3  | c        | 1           | 300               |

查询:

select table_a.campaign_id, SUM(table_a.sessions), SUM(table_b.some_other_metric)
FROM table_a
left join table_b ON table_a.campaign_id = table_b.campaign_id)
group by table_a.campaign_id

我正在寻找以下结果:

| campaign_id | SUM(table_a.sessions) | SUM(table_b.some_other_metric) |
|-------------|-----------------------|--------------------------------|
| 1           | 30                    | 600                            |

SUM(table_a.sessions) = 30
SUM(table_b.some_other_metric) = 600

但我得到了其他结果:

SUM(table_a.sessions) = 90
SUM(table_b.some_other_metric) = 1200

是否有不同的方式来连接这些表以获得结果?

提前致谢。

最佳答案

一种直接的方法是使用单独的子查询来聚合两个表中每个表中的总和:

SELECT
    a.campaign_id,
    COALESCE(a.sessions_sum, 0) AS session_sum,
    COALESCE(b.other_sum, 0) AS other_sum
FROM
(
    SELECT campaign_id, SUM(sessions) AS sessions_sum
    FROM table_a
    GROUP BY campaign_id
) a
LEFT JOIN
(
    SELECT campaign_id, SUM(some_other_metric) AS other_sum
    FROM table_b
    GROUP BY campaign_id
) b
    ON a.campaign_id = b.campaign_id;

上述方法有一个潜在的缺点,即table_b 出现的任何campaign_id 将从结果集中删除。但是,它并不比您当前的左连接方法差。理想情况下,您可以使用第三个表,其中包含您希望显示在结果集中的所有 campaign_id 值。

关于MySQL:加入很多:在两个表中选择总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57293349/

相关文章:

sql - MySQL 中的 COUNT(id) 与 COUNT(*)

mysql - 在多个数据库中更改表

PHP代码不创建数据库

php - 如何设置 Node.js、PHP 和 MySQL 的开发环境

php - 从数据库获取数据并与静态数组匹配

mysql - 查询以获取一个表中存在但不在另一个表中的记录

php - 每隔一个选定项目输出 4 个选定项目

Mysql:选择相对于第二个表

MySQL导入命令仅返回帮助信息

MySQL:如果表1中的记录在表2中的计数为0或1,则添加到表3