2

昨夜、宿題の手伝いを求めてここに投稿しました。最後の質問に行きます。

私が扱っているスキーマの関連部分は次のとおりです。

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

何か案は?

4

1 に答える 1

2

これを投稿してから約5秒後、エラーが見つかりました。「HAVING COUNT(...)」と言う代わりに「HAVING MAX(...)」を使用しましたが、正しい情報が得られています。

于 2010-10-14T21:31:04.903 に答える