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" 有几个属性,包括 id
、name
和 subject_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.
所包含的任何其他子句中
我有一个模型 "Playlist",其中 has_many 和 belongs_to 另一个模型 "User",通过中间模型 "PlaylistUser"。 "Playlist" 有几个属性,包括 id
、name
和 subject_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.