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
我得到一个零值(当我知道没有零值)
关于我的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.
您的查询有两种不明确之处:
ptype没有表限定,您没有透露表定义.所以查询是模糊的.
更重要的是,您希望:
ORDER BY programs.rating DESC, program_schedules.start DESC
Run Code Online (Sandbox Code Playgroud)
但是,与此同时,您指示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
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)