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

标签 sql ruby-on-rails ruby postgresql 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 数据库,因此相同的查询会返回此错误:

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

关于sql - 如何翻译 Postgresql 9.3 查询以在 Postgresql 8.4 上使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33678943/

相关文章:

sql - 合并多对多关系连接中的列值

sql - 在 SQL 中插入空白行数

ruby-on-rails - SSL_connect 返回=1 errno=0 状态=SSLv3 读取服务器证书,证书验证失败

ruby-on-rails - 如何分析 ruby​​ 错误?

ruby - 从 cron 执行 ruby​​ 脚本

mysql - 组合 "LIKE"、 "NOT LIKE"和 "OR"

sql - VertiPaq 是什么及其工作原理

ruby-on-rails - 使用 Jruby/Rails 实现 Google 的 hashbang/Ajax 爬网?

ruby-on-rails - 如何将多个设备型号重定向到多个特定网址?

ruby-on-rails - Rails 验证错误消息 : Add response code to default validators