【问题标题】:SQL multiple join with count, having troubleSQL多重连接计数,有问题
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 同意。如果您有没有匹配方和/或问题的用户记录,但您想向用户显示,那么外部联接就是这样做的方法。否则,您会将记录集限制为仅在所有三个表中都匹配的记录集。
【解决方案2】:

我想我已经明白了:

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

并且刚刚删除了 WHERE 子句。

【讨论】:

    【解决方案3】:

    我想我会为此使用子查询。家庭作业问题很有趣,我可以大量伪造代码。获取您拥有的整个查询并将其命名为“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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多