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