3

group byPostgreSQL は、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 に答える