TJ *_*ill 2 postgresql activerecord ruby-on-rails count ruby-on-rails-3
在has_many关联上运行以下查询.建议has_many批准.
我正在运行rails 3和PostgreSQL:
Recommendation.joins(:approvals).where('approvals.count = ?
AND recommendations.user_id = ?', 1, current_user.id)
Run Code Online (Sandbox Code Playgroud)
这将返回以下错误:https://gist.github.com/1541569
错误消息告诉您:
WHERE子句中不允许聚合
count()是一个聚合函数.使用HAVING子句.
查询可能如下所示:
SELECT r.*
FROM recommendations r
JOIN approvals a ON a.recommendation_id = r.id
WHERE r.user_id = $current_user_id
GROUP BY r.id
HAVING count(a.recommendation_id) = 1
Run Code Online (Sandbox Code Playgroud)
使用PostgreSQL 9.1或更高版本,对于表GROUP BY的主键(假设recommendations.id 是 PK)就足够了.在9.1之前的Postgres版本中,您必须包括未在列表中聚合的列表的所有列.随着在列表中,这将是该表中的每一单个列.SELECTGROUP BYrecommendations.*SELECT
我引用了PostgreSQL 9.1的发行说明:
GROUP BY在GROUP BY子句中指定主键时允许查询目标列表中的非列(Peter Eisentraut)
无论哪种方式,这都更简单,更快,做同样的事情:
SELECT *
FROM recommendations r
WHERE user_id = $current_user_id
AND (SELECT count(*)
FROM approvals
WHERE recommendation_id = r.id) = 1;
Run Code Online (Sandbox Code Playgroud)
避免JOIN使用先验乘以行,然后您不必将它们聚合回来.
| 归档时间: |
|
| 查看次数: |
4754 次 |
| 最近记录: |