在 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 为您提供来自 programs
的 DISTINCT
行。如果 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/