使用筛选的GroupBy查询返回零计数

时间:2019-05-23 13:19:26

标签: sql

我有一个Mail表,其中包含电子邮件列表及其内容,并链接到Sender表中,该表包含有关发件人的个人信息。 我想构建一个查询,该查询将为我提供Sender表中每个人发送的电子邮件数量,包括从未发送过任何电子邮件的电子邮件。

由于对SO提出了类似的问题,我设法将以下查询做到了这一点:

"SELECT Sender.name, COUNT(Mail.sender_id) FROM Sender LEFT OUTER JOIN Mail ON Mail.sender_id = Sender.id GROUP BY Sender.name"

给我:

[('Jack', 1), ('Jill', 10), ('John', 0)]

现在的问题是我想添加一个额外的过滤器,例如只从我感兴趣的时间段中选择计数。因此,我只是对查询的Mail集合添加了一个过滤器:

SELECT Sender.name, COUNT(Mail.sender_id) FROM Sender LEFT OUTER JOIN Mail ON Mail.sender_id = Sender.id WHERE Mail.reception_date >= '2017-01-01' GROUP BY Sender.name

但是现在,结果不再包含空值。

[('Jack', 1), ('Jill', 10)]

我尝试根据在此找到的建议将电子邮件过滤移至子查询:

SELECT Sender.name, COUNT(Mfil.sender_id) FROM (SELECT * FROM MAIL WHERE Mail.reception_date >= '2017-01-01') AS Mfil LEFT JOIN Sender ON Mfil.sender_id = Sender.id GROUP BY Sender.name

但是我仍然得到相同的结果:

[('Jack', 1), ('Jill', 10)]

对于可能的原因以及如何重新定义查询以检索使用过滤器时计数等于零的元素,我有点不知所措。

1 个答案:

答案 0 :(得分:1)

将条件移至ON子句:

SELECT s.name, COUNT(m.sender_id)
FROM Sender s LEFT OUTER JOIN
     Mail m
     ON m.sender_id = s.id AND
        m.reception_date >= '2017-01-01'
GROUP BY s.name;

您想保留所有发件人(大概是),因此它应该是from子句中的第一个表。