PostgreSQL HAVING子句

时间:2010-10-14 21:28:49

标签: sql postgresql aggregate-functions having

昨晚我在这里找了一些功课寻求帮助。我是关于我的最后一个问题。

这是我正在使用的架构的相关部分:

CREATE TABLE votesOnPoll(
  user_id int,
  poll_id int,
  option_id int, 
  voteDate date,
  CONSTRAINT votesOnPoll_pk PRIMARY KEY (user_id, poll_id),
  CONSTRAINT votesOnPoll_user_fk FOREIGN KEY (user_id) REFERENCES users(id),
  CONSTRAINT votesOnPoll_poll_fk FOREIGN KEY (poll_id,option_id) REFERENCES pollOptions(poll_id, option_id)
);

我正在尝试编写一个查询,该查询将返回投票最多的option_id投票选项,以及投票数。这仅适用于民意调查10。

我可以使用以下查询成功返回每个选项的投票数:

SELECT p10.oid AS option_id, MAX(p10.votecount)
FROM (SELECT option_id AS oid, COUNT(DISTINCT user_id) AS votecount
      FROM votesOnPoll
      WHERE poll_id = 10
      GROUP BY option_id) AS p10
GROUP BY p10.oid;

,在这种情况下,返回以下关系:

option_id | max
----------+-----
        0 |   7
        1 |  10
        2 |  11

我想减少它,因此它只有元组(2, 11)(或任何获胜选项)。我想我可以通过添加以下HAVING子句来完成此任务:

HAVING COUNT(p10.votecount) >= ALL (SELECT COUNT(DISTINCT user_id)
                                    FROM votesOnPoll
                                    WHERE poll_id = 10
                                    GROUP BY option_id)

但是,这会返回一个空关系。

我已经确认内部SELECT语句返回我期望的内容 - 也就是说,它返回一个属性的关系,该属性是特定选项的投票数。在这种情况下,返回值为:

 count
-------
     7
    10
    11

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

Aaaaaaand发布此消息后大约5秒钟,我发现了错误。我没有说“HAVING COUNT(...)”,而是使用了“HAVING MAX(...)”,我得到了正确的信息。