SQL ORDER BY子句导致GROUP BY /聚合错误

时间:2016-08-16 15:16:31

标签: sql ruby-on-rails

我收到此错误:

PG::GroupingError: ERROR:  column "relationships.created_at" must appear in the GROUP BY clause or be used in an aggregate function

来自此查询:

last_check = @user.last_check.to_i
@new_relationships = User.select('*')
                         .from("(#{@rels_unordered.to_sql}) AS rels_unordered")
                         .joins("
                    INNER JOIN  relationships
                    ON          rels_unordered.id = relationships.character_id
                    WHERE       EXTRACT(EPOCH FROM relationships.created_at) > #{last_check}
                    ORDER BY    relationships.created_at DESC
                    ")

没有ORDER BY行,它可以正常工作。我不明白GROUP BY子句是什么。如何让它工作并仍然按关系排序.created_at?

编辑

我知道你可以GROUP BY relationships.created_at。但不是不必要的分组吗?问题是relationship.created_at中未包含SELECT的问题吗?你怎么包括它?如果您已经使用INNER JOIN完成relationships,为什么结果中不包含relationships.created_at

我刚刚意识到这一切都在发生,因为日志显示查询以SELECT COUNT(*) FROM....开头。所以COUNT是聚合函数。但我从未要求过COUNT!为什么查询以此开头?

编辑2

好吧,这似乎是因为懒惰的查询而发生的。 @new_relationships发生的第一件事是@new_relationships.any?这会影响查询并将其转换为计数。所以我想问题是,如何强制查询按原计划运行?还要检查@new_relationships是否为空而不影响sql查询?

2 个答案:

答案 0 :(得分:1)

您只需要按照订单

添加分组
last_check = @user.last_check.to_i     
@new_relationships = 
  User.select('"rels_unordered".*')
      .from("(#{@rels_unordered.to_sql}) AS rels_unordered")
      .joins("INNER JOIN relationships   
              ON rels_unordered.id = relationships.character_id 
              WHERE EXTRACT(EPOCH FROM relationships.created_at) > #{last_check} 
              GROUP BY relationships.created_at
              ORDER BY relationships.created_at DESC ")

答案 1 :(得分:0)

要求在FROM(基本上是子选项)中的EXTRACT条款之后GROUP BY。有办法绕过它,但我发现做FROM relationships.created_at GROUP BY id工作往往更容易。尝试:... ORDER BY或您在该表中使用的任何索引列。您的 from django.contrib.admin.utils import NestedObjects 似乎与自身发生冲突。通过对子选择数据进行分组,它应该失去冲突。