3

group by我知道 PostgreSQL 与 MySQL 不同,在使用聚合函数时需要列出子句中的所有选定字段,例如

Transaction.select('sum(amount), category_id').group('category_id')

很公平。但是当我尝试急切加载关联时,例如

Transaction.select('sum(amount), categories.name').includes(:category).group('categories.name')

它不起作用,因为您没有在 group by 子句中包含两个模型的所有字段。

有没有办法避免列出模型的所有字段,或者我应该考虑接受 N+1 个查询?(当我只需要 2 个字段时,我认为列出 30 个字段没有意义……)

4

2 回答 2

3

从 PostgreSQL 的新版本(如果我没记错的话,9.1+)你只能按表的主键分组。以前的版本(以及大多数 RDBMS)要求您提供所有列。仅键异常有效,因为我们知道所有属性在功能上都依赖于键,因此如果键更改,其他属性无论如何都会不同。

正如弗兰克在上面的评论中指出的那样,MySQL 是一个例外。在这种情况下,这负责该数据库的许多非确定性方面。非确定性通常是不好的,应该避免。

于 2013-03-22T01:56:26.697 回答
0

另一种解决方法:可以列出所有这些键:

Model.first.attributes.keys.map{|a| "table_name.#{a}".to_sym}
于 2021-10-28T19:15:46.197 回答