昨夜、宿題の手伝いを求めてここに投稿しました。最後の質問に行きます。
私が扱っているスキーマの関連部分は次のとおりです。
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
投票数だけでなく、投票数が最も多い of poll オプションを返すクエリを作成しようとしています。これは投票 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
何か案は?