【问题标题】:Eager loading and group by in PostgreSQLPostgreSQL 中的急切加载和分组依据
【发布时间】:2011-11-07 00:14:53
【问题描述】:

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

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 个字段没有意义......)

【问题讨论】:

  • 每个 DBMS 都需要列出 group by 中的所有字段,MySQL 是个例外。由于这种行为,它导致了许多错误。

标签: ruby-on-rails ruby ruby-on-rails-3 eager-loading rails-postgresql


【解决方案1】:

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

Model.first.attributes.keys.map{|a| "table_name.#{a}".to_sym}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-23
      • 1970-01-01
      • 2014-02-24
      • 2011-04-02
      • 2023-04-03
      • 2016-07-04
      • 2021-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多