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()。如上所示,为了让您的查询返回文章属性,您还必须明确选择它们。

我希望这有帮助; 祝你好运

于 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

我假设该.uniq方法被翻译为DISTINCTSQL 上的一个子句。PostgreSQL 很挑剔(比 MySQL 更挑剔)——使用时选择列表中的所有字段都DISTINCT必须出现在ORDER_BY(and GROUP_BY) 子句中。

有点不清楚您要做什么(随机排序?)。除了发布发送的完整 SQL 之外,如果您可以解释您的目标,这可能有助于找到替代方案。

于 2012-03-18T16:18:03.577 回答
0

我刚刚将我的 100% 工作和测试的应用程序从 3.1.1 升级到 3.2.7,现在有同样的 PG::Error。

我用的是康康...

@users = User.accessible_by(current_ability).order('lname asc').uniq

删除 .uniq 可以解决问题,并且对于这个简单的查询来说无论如何都没有必要。

仍在查看 3.1.1 和 3.2.7 之间的更改说明,以了解导致此问题的原因。

于 2012-10-04T15:22:43.090 回答