我正在使用 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: ERROR: 在 WHERE 子句中不允许聚合
尝试2:“拥有”
我在 StackOverflow 上发现一个帖子说我应该尝试“Having”,所以我修改为
Request.includes(:responses).having("responses.user_id=? AND count(responses.id)=0", user_id).where("requests.created_at > ?", days_ago )
这产生了一个新的错误。ActiveRecord::StatementInvalid: PGError: 错误:
列“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 部分有子句,并且在当前格式中,它无意中排除了没有响应的用户(因此将始终是一个空集):
例如
having("responses.user_id=? AND count(responses.id)=0", user_id)
,
与原来的嵌入式选择相反:
选择计数(responses.id)=0 WHERE response.user=?
但我不确定对于没有回应的表面用户来说,have 子句的正确形式应该是什么。
提前感谢您的帮助!