选择用户尚未响应的请求

时间:2013-02-11 00:13:48

标签: ruby-on-rails postgresql activerecord having-clause

我正在使用heroku / rails / pgsql 9.1.6并将我的头撞在墙上,感觉它应该是一个非常简单的查询。

我想展示用户尚未回复的最近“请求”

尝试1(在我推送到heroku / pgsql之前工作):

Request.includes(:responses).where("(select count(responses.id)=0 WHERE responses.user=?) AND requests.created_at > ?", user_id, days_ago ) 

一旦我推送到heroku,该查询就会产生错误:

  

ActiveRecord :: StatementInvalid:PGError:错误:聚合不   在WHERE子句中允许

尝试2:“有”

我在StackOverflow上找到一个帖子,说我应该尝试“有”,所以我修改为

Request.includes(:responses).having("responses.user_id=? AND count(responses.id)=0", user_id).where("requests.created_at > ?", days_ago )

这产生了一个新错误。 ActiveRecord :: StatementInvalid:PGError:ERROR:

  

列“requests.id”必须出现在GROUP BY子句中或用于   聚合函数

尝试3:“群组”

然后我将该查询修改为

Request.includes(:responses).group("requests.id").group("responses.id").having("responses.user_id=? AND count(responses.id)=0", user_id).where("requests.created_at > ?", days_ago ) 

这会运行,但即使我知道它应该返回一个值,也会返回一个空集。

最好的猜测:

我怀疑此时的问题是2 part having子句,并且在当前格式中,它无意中排除了未响应的用户(因此将始终为空集):

e.g。 having("responses.user_id=? AND count(responses.id)=0", user_id)

与原始嵌入式选择相反:

  

select count(responses.id)= 0 WHERE responses.user =?

但是我不确定for子句的正确形式应该是没有响应的表面用户。

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

Request.where('(SELECT Count(*) FROM responses WHERE responses.request_id = requests.id) > 0')