1

Mysqlでは正しく機能します。

PG :: Error:ERROR:SELECT DISTINCTの場合、ORDERBY式は選択リストに表示される必要があります行1:)ORDER BY programs.rating DESC、program_sc ... ^:

クエリ:

SELECTDISTINCT"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

私のDBに関するいくつかの情報:

class Program < ActiveRecord::Base
   has_many :program_schedules
end


class ProgramSchedule < ActiveRecord::Base
  belongs_to :program
end

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

編集: 「programs_schedules」を注文する必要はありません。そのプログラムに関連する配列内のすべてのprograms_schedulesが必要だからです。

4

1 に答える 1

7

クエリは2つの点であいまいです。

ptypeはテーブル修飾されておらず、テーブル定義を開示していません。したがって、クエリはあいまいです。

さらに重要なのは、次のことです。

ORDER BY programs.rating DESC, program_schedules.start DESC

ただし、同時に、DISTINCTからの行を提供するようにPostgreSQLに指示します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

また、これが機能するために必要なPostgreSQL9.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 に答える