如何使用另一个表中的where子句选择计数(*)返回空行?

时间:2019-05-10 21:40:00

标签: postgresql

我遇到了这个问题:

我有2张桌子:

tbl_statistics:

id   |   name
1    |  Clicks on purchase button
2    |  Total logins

tbl_statistics_detailed:

id   |  stat_id (FK) |  date
1    |      2        | 2019-05-10 18:30:00

当我在postgre上执行以下命令时:

SELECT s.name, count(sd.id) AS count 
FROM tbl_statistics_detailed sd 
RIGHT OUTER JOIN tbl_statistics s ON s.id = sd.stat_id 
WHERE sd.date BETWEEN '2019-05-01 00:00:00' AND '2019-05-21 00:00:00'
GROUP BY sd.stat_id,s.name;

我得到的结果是:

name          |  count
Total logins  |    1

但是我想要的是:

name                          |  count
Total logins                  |    1
Clicks on the purchase button |    0

我在做什么错了?

2 个答案:

答案 0 :(得分:1)

好吧,sd.date为空,因为不存在详细信息,因此您的WHERE子句对它们来说不是正确的将其转换为联接条件。而当您使用它时,可能使其成为左联接。这更容易阅读。

SELECT s.name,
       count(sd.id) count 
       FROM tbl_statistics s
            LEFT JOIN tbl_statistics_detailed sd 
                      ON sd.stat_id = s.id
                         AND sd.date BETWEEN '2019-05-01 00:00:00'
                                             AND '2019-05-21 00:00:00'
       GROUP BY s.name;

答案 1 :(得分:0)

您的右外部联接在创建以下行之前进行过滤/分组:

sd.id | sd.stat_id | sd.date |    s.id   |   s.name
 NULL |  NULL      |  NULL   |    1      |  Clicks on purchase button
  1   |     2      | 5/10    |    2      |  Total logins

这是您想要的,但是您的WHERE子句正在过滤掉第一行。可以检查日期是否在您期望的范围OR date is null之间,并且它应该为您提供所需的内容,因为您正在执行count(sd.id),应该忽略NULL值。