在Rails中选择Distinct的PostgreSQL错误

spa*_*kle 1 postgresql ruby-on-rails ruby-on-rails-3 rails-postgresql

在Mysql上它可以正常工作.

PG ::错误:错误:对于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

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.*).join(:program_schedules).where(...

但是,就这样,当我要读书的时候

@ data.program_schedules

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

PostgreSQL 9.2(Heroku),Ruby 1.9.2

关于我的DB的一些信息:

class Program < ActiveRecord::Base
   has_many :program_schedules
end


class ProgramSchedule < ActiveRecord::Base
  belongs_to :program
end
Run Code Online (Sandbox Code Playgroud)

Schema.db

 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
Run Code Online (Sandbox Code Playgroud)

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

Erw*_*ter 7

您的查询有两种不明确之处:

ptype没有表限定,您没有透露表定义.所以查询是模糊的.

更重要的是,您希望:

ORDER BY programs.rating DESC, program_schedules.start DESC
Run Code Online (Sandbox Code Playgroud)

但是,与此同时,您指示PostgreSQL为您提供DISTINCTprograms.如果有多个匹配的行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
Run Code Online (Sandbox Code Playgroud)

还假设你有PostgreSQL 9.0或更高版本,这是必须的.(主键覆盖整个表格GROUP BY.)

至于:

在Mysql上它可以正常工作.

不,不.它"有效",但是以神秘的方式而不是"正确".MySQL允许出现各种奇怪的错误,并且不采取行动(以及SQL标准)以避免抛出异常 - 这是处理错误的一种非常不幸的方法.它会经常回来困扰你.在Youtube上演示.

问题更新

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

您可能想要添加:

SELECT p.*, array_agg(ps.start ORDER BY ps.start)
Run Code Online (Sandbox Code Playgroud)