2016-08-16 28 views
0

我得到这个错误:SQL ORDER BY子句造成GROUP BY /总误差

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子句。我如何得到它的工作,仍然通过relationships.created_at排序?

编辑

我明白可以GROUP BY relationships.created_at。但不是不必要的分组? SELECT中是否包含relationship.created_at的问题?你如何包含它?如果你已经完成INNER JOINrelationships,为什么地狱不是relationships.created_at包括在结果??

我刚刚意识到这一切都是因为日志显示查询以SELECT COUNT(*) FROM....开头。所以COUNT是聚合函数。但我从来没有要求COUNT!为什么查询从那开始?

EDIT 2

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

+2

的可能的复制[有没有\ _Value为MySQL 5.6的能力?](http://stackoverflow.com/questions/37089347添加组/ is-there-any-value-capability-for-mysql-5-6) – e4c5

+2

当GROUP BY(以及SELECT DISTINCT和UNION)时,只有选择列表项可以在ORDER BY中指定。 – jarlh

回答

0

这是要求您的FROM子句后在EXTRACT(本质上是子选择)GROUP BY。有办法解决这个问题,但我发现做一个GROUP BY工作通常更容易。尝试:... FROM relationships.created_at GROUP BY id或您在该表中使用的任何索引列。看起来你的ORDER BY与自己冲突。通过对子选择数据进行分组,它应该失去它的冲突。

+0

注意:虽然它应该会失去冲突,但它也可以从输出中消除所需的数据,如果发生这种情况,示例表会帮助您找到正确的语法 – Jackson

1

你只需要沿着与ORDER BY子句

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 ") 
+0

对不起,请接受您的回答,但是:它现在抱怨说''rels_unordered.id必须出现在GROUP BY子句中或用于聚合函数中'。最好避免一个“GROUP BY”子句,而是在集合函数中包含'relationships.created_at'?如何编码? – Bazley