Rails 3,ActiveRecord,PostgreSQL - ".uniq"命令不起作用?

use*_*621 16 database postgresql activerecord uniq ruby-on-rails-3

我有以下查询:

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

并给我错误

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

当我将原始查询更新

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

所以错误消失了...在MySQL .uniq工作,在PostgreSQL中没有.存在任何替代方案?

nsl*_*cum 30

正如错误所述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)
Run Code Online (Sandbox Code Playgroud)

因此,明确包含您的ORDER BY子句(在本例中RANDOM())使用.select().如上所示,为了使您的查询返回Article属性,您还必须明确选择它们.

我希望这有帮助; 祝好运

  • 为什么你必须在postgresql中首先将你订购的内容添加到select子句中.如果您正在使用连接,那么sql应该足够聪明,无需在select子句中明确声明它就可以知道要排序的内容(特别是因为select子句旨在限制返回的列). (2认同)