【发布时间】:2010-10-14 17:02:58
【问题描述】:
首先,这是一项家庭作业,所以我正在寻求帮助,而不是解决方案。让我试着解释一下我的架构。我有三个表,我们将分别称为 users(列 id 和 name)、party(列 id、partydate 和 user_id)和 questions(列 id、createdate 和 user_id)。我的要求是向每个用户显示去年参与的人数以及去年创建的问题。起初我有这样的事情:
SELECT users.id, users.name,
COUNT(parties.id) AS numparties, COUNT(qustions.id) AS numquestions
FROM users
FULL JOIN parties ON users.id=parties.user_id
FULL JOIN questions ON users.id=questions.user_id
WHERE (parties.partydate > NOW() - interval '1 year' OR parties.partydate IS NULL)
OR (questions.createdate > NOW() - interval '1 year' OR questions.createdate IS NULL)
GROUP BY users.id, users.name
现在几乎可以了!问题是,如果用户在过去一年内没有聚会或问题,他们根本不会出现在结果中。我希望这样的用户出现,我只希望它为每个 numparties 和 numquestions 显示 0。
我认为我需要的是某种条件计数,我只想在该党的聚会日期在过去一年内的情况下计数(party.id),对于问题也是如此。我只是不确定该怎么做。我有一个 hacky-workaround 方法来做我想做的事,我基本上将上述查询与自身几乎相同的副本联合起来,除了我对 numparties 和 numquestions 使用 SUM(0) 并且我的 WHERE 语句就是日期的位置 。我觉得这不是最好的方法。
任何指向正确方向的指针?感谢您的帮助!
【问题讨论】:
-
文体调整:如果有 NULL 的可能性,我总是把它放在第一位,如
(parties.partydate IS NULL OR parties.partydate > NOW() - interval '1 year')
标签: sql postgresql count