Предложение PostgreSQL HAVING - PullRequest
       12

Предложение PostgreSQL HAVING

2 голосов
/ 15 октября 2010

Я отправил сюда вчера вечером в поисках помощи с домашней работой. Я перешел к моему последнему вопросу.

Вот соответствующий фрагмент схемы, с которой я работаю:

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 Ответ

2 голосов
/ 15 октября 2010

ааааааа а примерно через 5 секунд после публикации я обнаружил ошибку. Вместо того, чтобы сказать «HAVING COUNT (...)», я использовал «HAVING MAX (...)», и я получаю правильную информацию.

...