获取主表中每一行的每个联接表的行数

时间:2019-05-29 14:01:12

标签: mysql sql count

我的数据库中有三个表。星型模式中的中央表是发送,带有一个称为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;

1 个答案:

答案 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