1

在 Mysql 上它可以正常工作。

PG::Error: ERROR: 对于 SELECT DISTINCT,ORDER BY 表达式必须出现在选择列表 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

导轨代码:

@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。

4

1 回答 1

7

您的查询在两种情况下模棱两可:

ptype不是表限定的,您没有透露表定义。所以查询是模棱两可的。

更重要的是,您希望:

ORDER BY programs.rating DESC, program_schedules.start DESC

然而,与此同时,您指示 PostgreSQL 为您提供DISTINCT来自programs. 如果 中有多个匹配的行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。)

至于:

在 Mysql 上它可以正常工作。

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

问题更新

我需要数组中与该程序相关的所有programs_schedules。

您可能要添加:

SELECT p.*, array_agg(ps.start ORDER BY ps.start)
于 2012-11-04T00:11:39.763 回答