2010-10-14 132 views
2

昨晚我在这里发布了一些帮助作业。我回到最后一个问题。PostgreSQL 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 

任何想法?

回答

2

Aaaaaaand发贴之后大约5秒钟,我发现了错误。我没有说“有计数(...)”,而是使用了“有MAX(...)”,并且我得到了正确的信息。

+2

LoL LoL LoL LoL!你看,我很早以前就注意到,找到自己问题的答案没有更快的方法,而是先正确地提出问题。 – 2010-10-14 21:45:07