SQL多次加入计数,遇到麻烦

时间:2010-10-14 17:02:58

标签: sql postgresql count

首先,这是一项家庭作业,所以我正在寻求帮助,而不是解决方案。让我试着解释一下我的架构。我有三个表,我们将调用用户(具有列id和名称),party(具有列id,partydate和user_id)和问题(具有列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。

我认为我需要的是某种条件计数,其中我只想要COUNT(parties.id)该党的参与者在过去的一年内,并且问题也是如此。我只是不确定该怎么做。我有一个hacky-workaround方法来做我想要的,我基本上UNION上面的查询与自己几乎相同的副本,除了我使用SUM(0)的numparties和numquestions和我的WHERE语句只是日期是&lt的地方; =而不是>。我觉得这不是最好的方法。

正确方向的任何指针?谢谢你的帮助!

3 个答案:

答案 0 :(得分:1)

看看这个:http://www.w3schools.com/sql/sql_join_left.asp。我认为它可能会指出你正确的方向。

答案 1 :(得分:0)

认为我已经得到了它:

SUM(CASE WHEN (parties.partydate > NOW() - interval '1 year') THEN 1 ELSE 0 END) as numparties

并删除了WHERE子句。

答案 2 :(得分:0)

我想我会为此寻求一个子查询。家庭作业问题很有趣,我可以大量伪装代码。获取您拥有的整个查询并将其命名为“x”。

您需要的第一件事是所有用户的列表,无论他们问过多少问题。

Select distinct users.id,users.name from users

将为您提供完整的用户列表。您上面的查询为您提供了呼叫......所以请将两者连接在一起。

Select (fields you want)
from users
left join (enter you query above here) x on x.id = users.id

希望这里的逻辑对你有意义。使用一个查询来获取用户列表并将其加入子查询以获取其计数。

编辑添加:只要没有记录,这将带回空值。您可以将select语句显示为0的