ruby-on-rails - 在 Rails 中选择不同的 PostgreSQL 错误

标签 ruby-on-rails ruby-on-rails-3 postgresql rails-postgresql

在 Mysql 上它可以正常工作。

PG::Error: ERROR: for SELECT DISTINCT, ORDER BY expressions must appear in select list LINE 1: ) ORDER BY programs.rating DESC, program_sc... ^ :

查询:

SELECT DISTINCT "programs".* FROM "programs" INNER JOIN "program_schedules" ON "program_schedules"."program_id" = "programs"."id" WHERE (programs.rating >= 5 AND program_schedules.start >= '2012-11-03 23:14:43.457659') AND (ptype = 'movie') ORDER BY programs.rating DESC, program_schedules.start DESC

rails 代码:

@data = Program.joins(:program_schedules).where('programs.rating >= ? AND program_schedules.start >= ?',5, Time.now).order('programs.rating DESC, program_schedules.start DESC').uniq

我试过

Program.select("programs.*, program_schedules.*).joins(:program_schedules).where(...

但是,这样一来,当我要阅读的时候

@data.program_schedules

我得到一个 nil 值(当我知道没有 nil 值时)

PostgreSQL 9.2 (Heroku), Ruby 1.9.2

关于我的数据库的一些信息:

class Program < ActiveRecord::Base
   has_many :program_schedules
end


class ProgramSchedule < ActiveRecord::Base
  belongs_to :program
end

架构数据库

 create_table "program_schedules", :force => true do |t|
        t.integer  "program_id"
        t.datetime "start"
  end

  create_table "programs", :force => true do |t|
    t.string  "title",
    t.string  "ptype"
  end

编辑: 我不需要订购“programs_schedules”,因为我需要数组中与该程序相关的所有 programs_schedules。

最佳答案

您的查询在两个方面不明确:

ptype 不是表限定的,您没有透露表定义。所以查询是不明确的。

更重要的是,您想要:

ORDER BY programs.rating DESC, program_schedules.start DESC

然而,与此同时,您指示 PostgreSQL 为您提供来自 programsDISTINCT 行。如果 program_schedules 中有多个匹配行,Postgres 如何知道为 ORDER BY 子句选择哪一个?首先?最后的?最早、最新、最环保?它只是未定义。

通常,ORDER BY 子句不能与 DISTINCT 子句不一致,这就是错误消息告诉您的内容。

根据一些假设,填补缺失的信息,您的查询可能如下所示:

SELECT p.*
FROM   programs p
JOIN   program_schedules ps ON ps.program_id = p.id
WHERE  p.rating >= 5
AND    ps.start >= '2012-11-03 23:14:43.457659'
AND    p. ptype = 'movie'   -- assuming ptype is from programs  (?)
GROUP  BY p.id              -- assuming it's the primary key
ORDER  BY p.rating DESC, min(ps.start) DESC;  -- assuming smallest start

还假设您有 PostgreSQL 9.0 或更高版本,这是工作所必需的。 (主键覆盖 GROUP BY 中的整个表。)

至于:

On Mysql it works correctly.

不,不是。它“有效”,但以神秘的方式而不是“正确”。 MySQL 允许出现各种奇怪的错误,并竭尽全力(和 SQL 标准)避免抛出异常——这是一种非常不幸的错误处理方式。它会定期回来困扰你。 Demo on Youtube .

问题更新

I need all programs_schedules in my array related to that program.

您可能想添加:

SELECT p.*, array_agg(ps.start ORDER BY ps.start)

关于ruby-on-rails - 在 Rails 中选择不同的 PostgreSQL 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13214494/

相关文章:

python - SQLAlchemy:按天对多个表进行分组

postgresql - 选择具有空比较的项目

ruby-on-rails - 即使安装了 2.3.1,仍卡在 ruby​​ -v ruby​​ 2.0.0p648 上,我该如何更改它?

mysql - WAMP 的 MySQL "lib"和 "include"目录在哪里?

ruby-on-rails - 使用 XPath 从节点中选择属性

ruby-on-rails-3 - 需要 Google-Maps-for-Rails Direction Wiki 说明

ruby - 连接池返回 Redis 的实例而不是 ConnectionPool

xml - RXML 模板生成器的 Rails 3.1 替代品

postgresql - Adminer & Migrate 无法连接到 Postgresql Docker 容器

ruby-on-rails - 设计要求用户接受服务条款?