2016-08-16 25 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