我的数据库中有三个表。星型模式中的中央表是发送,带有一个称为id
的PK列。每个发送记录的表打开中可以有零行或更多行。
sendings.id = opens.sending_id
类似地,第三个名为clicks的表与发送表具有以下关联(一个发送可以具有零次或多次点击):
sendings.id = clicks.sending_id
打开和点击表都有其唯一的ID列,称为id
。
我想在一个查询中 是每次发送的所有关联打开和点击的计数。以下查询似乎无法满足该需求。
select s.id,
count(o.id) as open_count,
count(c.id) as click_count
from sendings s
left join opens o on s.sending_id = o.sending_id
left join clicks c on s.sending_id = c.sending_id
group by s.id;
答案 0 :(得分:1)
简单的解决方案是使用count(distinct)
:
select s.id,
count(distinct o.id) as open_count,
count(distinct c.id) as click_count
from sendings s left join
opens o
on s.sending_id = o.sending_id left join
clicks c
on s.sending_id = c.sending_id
group by s.id;
count()
仅计算非NULL
值的数量。
通常,更高性能的解决方案是在join
之前使用相关子查询或聚合:
select s.id, o.open_count, c.click_count
from sendings s left join
(select o.sending_id, count(*) as open_count
from opens o
group by o.sending_id
) o
on s.sending_id = o.sending_id left join
(select c.sending_id, count(*) as click_count
from clicks c
group by c.sending_id
) c
on s.sending_id = c.sending_id;
请注意,在这种情况下,不需要外部group by
。