16

次のクエリがあります。

Article.joins(:themes => [:users]).where(["articles.user_id != ?", current_user.id]).order("Random()").limit(15).uniq

そして私にエラーを与える

PG::Error: ERROR:  for SELECT DISTINCT, ORDER BY expressions must appear in select list
LINE 1: ...s"."user_id" WHERE (articles.user_id != 1) ORDER BY Random() L...

元のクエリを更新すると

Article.joins(:themes => [:users]).where(["articles.user_id != ?", current_user.id]).order("Random()").limit(15)#.uniq

そのため、エラーはなくなりました... MySQLでは.uniqは機能しますが、PostgreSQLでは機能しません。代替手段はありますか?

4

4 に答える 4

31

エラーが示すようにfor SELECT DISTINCT, ORDER BY expressions must appear in select list。したがって、注文する句を明示的に選択する必要があります。

これはあなたのケースに似ていますが、少し一般化した例です。

Article.select('articles.*, RANDOM()')
       .joins(:users)
       .where(:column => 'whatever')
       .order('Random()')
       .uniq
       .limit(15)

したがって、を使用ORDER BYして句 (この場合はRANDOM()) を明示的に含めます.select()。上記のように、クエリが Article 属性を返すためには、それらも明示的に選択する必要があります。

これがお役に立てば幸いです。幸運を

于 2012-07-13T19:00:02.850 に答える
2

より多くの例でスレッドを充実させるために、クエリでリレーションがネストされている場合は、次のステートメントを試すことができます。

Person.find(params[:id]).cars.select('cars.*, lower(cars.name)').order("lower(cars.name) ASC")

与えられた例では、モデル名(アウディ、フェラーリ、ポルシェ)順に並べられた、特定の人のすべての車を尋ねています。

これがより良い方法だとは思いませんが、リレーショナル (データベース) の方法ではなく、オブジェクトとコレクションで考えるこの種の状況に対処するのに役立つかもしれません。

ありがとう!

于 2013-01-04T16:27:15.510 に答える
1

メソッドはSQLの句に.uniq変換されると思います。DISTINCTPostgreSQLはうるさい(MySQLよりもピッキー)-使用する場合の選択リストのすべてのフィールドは、 (および)句DISTINCTに存在する必要があります。ORDER_BYGROUP_BY

あなたが何をしようとしているのかは少し不明確です(ランダムな順序ですか?)。送信された完全なSQLを投稿することに加えて、目的を説明できれば、代替案を見つけるのに役立つ可能性があります。

于 2012-03-18T16:18:03.577 に答える