2015-05-24 60 views
2
​​

作品與我的開發環境sqlite3的作品爲Rails 3.2的應用程序,但是當這個錯誤推到Heroku的使用Postgres的失敗:變換查詢,在SQLite的作品到的東西,在Postgres的

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

似乎它在查詢中想要:created_at。無法拿出任何東西。有任何想法嗎?

感謝

+1

您是否嘗試過將created_at添加到查詢中? 'Message.order(「created_at DESC」)。其中(user_id:current_user.id).group(:sender_id,:receiver_id,:created_at).count' – hd1

+0

@ hd1:雖然這會使Postgre接受查詢,但結果會可能不是所期望的:從用戶1到用戶2的2條消息將不會被分組在一起,除非它們是在確切的時間發送的,這是不太可能的(並且可能不是想要的行爲)。 – Marth

+0

對上述兩條評論都是肯定的。添加:created_at將使查詢適用於Postgres,但結果不正確。實際上,它不再進行分組,因爲每條消息都有唯一的:created_at列。 – slindsey3000

回答

1

的PostgreSQL無法弄清楚如何通過你的created_at訂購。

假設你發現2組(:sender_id, :receiver_id),例如[1, 2]
[1, 3]
現在假設在第一組中有兩條消息,一條是從1天前發出的,另一條是從1分鐘前發出的。假設你在12小時前的第二組中有1條消息。
然後ORDER BY created_at DESC沒有任何意義:你是否從1天前將消息作爲第一組的created_at(因此第一組出現在第二組之後),或者是1分鐘前的消息(在這種情況下第一組現在首先出現)?

這就是爲什麼PostgreSQL的說,你需要或者有created_atGROUP BY(在這種情況下,你現在有3個不同的組,作爲第一個在兩個現在拆分),或者你需要使用一個聚合函數將多個值created_at轉換爲單個值。


這將運行(我不知道你期望的結果是什麼,你可能不希望使用MAX(created_at)你可以找到PostgreSQL的聚合函數here清單!):

Message.order("MAX(created_at) DESC") 
     .where(user_id: current_user.id) 
     .group(:sender_id, :receiver_id) 
     .count 
+1

工作。謝謝你,先生。完美。 – slindsey3000