如何翻译 Postgresql 9.3 查询以在 Postgresql 8.4 上使用?

How to translate Postgresql 9.3 query for use on Postgresql 8.4?

在开发中,我有一个 Postgresql 9.3.10 数据库,下面的查询完美运行:

@playlist_ids = @playlist.user_ids
@more_playlists = Playlist.joins(:users).where.not('playlists.id = ? OR playlists.id = ?', 30, 41).where(users: {id: @playlist_ids}).group('playlists.id').order('count(*) desc')

简而言之,对于播放列表 @playlist,此查询列出了与 @playlist 共享一个用户的所有其他播放列表,按它们共享的数量排序。

但是,在生产环境中我使用的是 Postgresql 8.4.22 数据库,所以同样的查询 returns 这个错误:

PG::GroupingError: ERROR:  column "playlists.name" 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  ORDER BY count(*) desc

如何更改我的查询以使用 Postgresql 8.4?


协会

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

我不能谈论 rail 但我不知道为什么这在 9.3 中有效,因为两者都不应该有效。

我建议您直接在您的数据库上尝试此查询。 (9.3 和 8.4)

你的sql有这个

SELECT "playlists".* // <- multiple fields 
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  // <- a single field agregation'
ORDER BY count(*) DESC

GROUP BY 字段应匹配 SELECT 字段。只有 mySQL 支持那些疯狂的东西。

您的查询应该类似于

SELECT playlists.id, playlists.name, COUNT(*)
FROM ....
GROUP BY playlists.id, playlists.name
ORDER BY count(*) DESC