Я отправил сюда вчера вечером в поисках помощи с домашней работой. Я перешел к моему последнему вопросу.
Вот соответствующий фрагмент схемы, с которой я работаю:
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
Есть идеи?