Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL多重连接计数,遇到问题_Sql_Postgresql_Count - Fatal编程技术网

SQL多重连接计数,遇到问题

SQL多重连接计数,遇到问题,sql,postgresql,count,Sql,Postgresql,Count,首先,这是一个家庭作业,所以我在寻求帮助,而不是解决方案。让我试着解释一下我的模式。我有三个表,我们将调用users(使用列id和name)、parties(使用列id、partydate和user_id)和questions(使用列id、createdate和user_id)。我的要求是为每个用户显示去年的参与方数量和去年提出的问题。起初我有这样的想法: SELECT users.id, users.name, COUNT(parties.id) AS numparties, COUNT(

首先,这是一个家庭作业,所以我在寻求帮助,而不是解决方案。让我试着解释一下我的模式。我有三个表,我们将调用users(使用列id和name)、parties(使用列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

我想我需要的是某种有条件的计算,我只想计算(parties.id)过去一年中该党的党籍在哪里,对于问题也是如此。我只是不知道怎么做。我有一种简单的变通方法来做我想做的事情,基本上我将上面的查询与它本身的一个几乎相同的副本合并,除了我对numparties和numquestions使用SUM(0),我的where语句正好是日期所在的位置。我觉得这不是最好的办法


有没有指向正确方向的指针?谢谢你的帮助

看看这个:。我想这可能会给你指明正确的方向。

看看这个:。我想这可能会给你指明正确的方向。

我想我已经做到了:

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

只是删除了WHERE子句

我想我已经做到了:

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

只是删除了WHERE子句

我想我应该为此求助于子查询。家庭作业的问题回答起来很有趣,我可以很容易地把它编出来。把你的整个查询称为“x”

您首先需要的是所有用户的列表,不管他们问了多少问题

Select distinct users.id,users.name from users
这将为您提供一个完整的用户列表。上面的查询提供了there调用…所以左键将两者连接在一起

Select (fields you want)
from users
left join (enter you query above here) x on x.id = users.id
希望这里的逻辑对你有意义。使用一个查询获取用户列表,并将其连接到子查询以获取其计数


编辑添加:这将在没有记录时返回空值。您可以让select语句将空值显示为0,我想我应该求助于子查询。家庭作业的问题回答起来很有趣,我可以很容易地把它编出来。把你的整个查询称为“x”

您首先需要的是所有用户的列表,不管他们问了多少问题

Select distinct users.id,users.name from users
这将为您提供一个完整的用户列表。上面的查询提供了there调用…所以左键将两者连接在一起

Select (fields you want)
from users
left join (enter you query above here) x on x.id = users.id
希望这里的逻辑对你有意义。使用一个查询获取用户列表,并将其连接到子查询以获取其计数


编辑添加:这将在没有记录时返回空值。您可以让select语句将空值显示为0的

风格调整:如果有空的可能性,我总是将其放在第一位,如
(parties.partydate为空或parties.partydate>NOW()-间隔“1年”)
风格调整:如果有空的可能性,我总是将其放在第一位,如
(parties.partydate为空或parties.partydate>NOW()-间隔“1年”)
同意。如果您的用户记录中没有匹配的参与方和/或问题,但您想向用户显示,则可以使用外部联接。否则,您将仅将记录集限制为所有三个表中都匹配的记录。同意。如果您的用户记录中没有匹配的参与方和/或问题,但如果要向用户显示,则可以使用外部联接。否则,您将仅将记录集限制为所有三个表中都有匹配项的记录集。