【问题标题】:Selecting requests a user hasn't responded to yet选择用户尚未响应的请求
【发布时间】:2013-02-11 00:13:47
【问题描述】:

我正在使用 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: 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 部分有子句,并且在当前格式中,它无意中排除了没有响应的用户(因此将始终是一个空集):

例如 having("responses.user_id=? AND count(responses.id)=0", user_id),

相对于原来的嵌入式选择:

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

但我不确定对于没有回应的表面用户来说,have 子句的正确形式应该是什么。

提前感谢您的帮助!

【问题讨论】:

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


    【解决方案1】:

    试试

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

    【讨论】:

      猜你喜欢
      • 2015-07-13
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      • 1970-01-01
      • 2014-07-28
      • 1970-01-01
      • 2018-05-29
      相关资源
      最近更新 更多