Postgresql Grouping Error 指的是查询中从未引用过的列

Postgresql Grouping Error refers to a column that was never referenced in the query

我有一个模型 "Playlist",其中 has_many 和 belongs_to 另一个模型 "User",通过中间模型 "PlaylistUser"。 "Playlist" 有几个属性,包括 idnamesubject_id

我正在尝试使此查询正常工作:

@playlist_ids = @playlist.user_ids
@more = Playlist.select('playlists.id, playlists.name')
    .joins(:playlist_users)
    .where('playlists.id NOT IN (30, 41)')
    .where(playlist_users: {user_id: @playlist_ids})
    .group('playlists.id, playlists.name')
    .order('count(*) desc')

对于给定的播放列表 @playlist,它应该列出与 @playlist 共享一个用户的所有其他播放列表,按它们共享的数量排序。

它适用于 Postgres 9.4,但对于 Postgres 8.4 它returns这个错误:

PG::GroupingError: ERROR:  column "playlists.subject_id" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1: SELECT "playlists".* FROM "playlists" INNER JOIN "playlist...
           ^
: SELECT "playlists".* FROM "playlists" INNER JOIN "playlist_users" ON "playlist_users"."playlist_id" = "playlists"."id" INNER JOIN "users" ON "users"."id" = "playlist_users"."user_id" WHERE (NOT (playlists.id = 30 OR playlists.id = 41)) AND "users"."id" IN (45, 89, 71, 117, 115, 173, 177, 180, 161, 220, 223, 199, 221, 239, 204, 205, 206, 207, 211, 261, 282, 284, 286, 251, 252, 255, 310, 311, 315, 318, 307, 362, 319, 306, 289, 316, 305, 321, 322, 330, 333, 292, 294, 304, 300, 340, 341, 342, 343, 405, 406, 410, 408, 409, 407, 413, 416, 417, 418, 425, 427, 392, 401, 403, 445, 446, 449, 450, 379, 456, 451, 454, 459, 437, 442, 444, 496, 501, 518, 548, 549, 533, 553, 1112, 1113, 1459, 455, 348, 1458, 242, 1275, 151, 1890, 336, 203, 404, 166, 453, 114, 157, 285, 448, 447, 443, 550, 2167, 2168, 287, 320, 293, 65, 2098, 2097, 2099, 387, 3, 2175, 2170, 2174, 2182, 2171, 438, 2180, 2181, 2169, 2176, 347, 2429, 2177, 2445, 2178, 2447, 58, 2480, 390, 452, 554, 555, 313, 92, 275, 335, 428, 167, 302, 2173, 1538) GROUP BY playlists.id, playlists.name  ORDER BY count(*) desc

但我没有在我的查询中的任何地方,或我所在页面的视图、控制器或模型中的任何地方引用 subject_id 列。

为什么该列与我的查询是否有效有关?


协会:

class Playlist < ActiveRecord::Base
  has_many :playlist_users
  has_many :users, :through => :playlist_users
end

class PlaylistUser < ActiveRecord::Base
  belongs_to :playlist
  belongs_to :user
end

class User < ActiveRecord::Base
  has_many :playlist_users
  has_many :playlists, :through => :playlist_users
end

也许您没有明确引用 subject_id,但您的结果查询使用:

  SELECT "playlists".* FROM "playlists"

并且由于通配符 * 您将获得播放列表中的所有列,其中包括 playlists.subject_id

您必须将该列添加到 group_by 子句以及通配符 SELECT.

所包含的任何其他子句中