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

埃尔科·卢尔瑟玛(Eelco Luurtsema)

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

| 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

有没有其他方法可以联接此表以获得结果?

提前致谢。

蒂姆·比格莱森(Tim Biegeleisen)

一种简单的方法是使用单独的子查询来汇总两个表中每个表的和:

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;

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章