我遇到了这个问题:
我有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
我在做什么错了?
答案 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值。