2011-06-04 50 views
0

下面的代碼工作Postgres的(Heroku的):ORDER BY Postgres裏(Heroku的)問題

@messages = Message.select("DISTINCT 
ON (messages.conversation_id) 
*").where("messages.sender_id = (?) OR messages.recipient_id = (?)", 
current_user.id, current_user.id) 

但是,試圖訂購通過附加.order("messages.read_at DESC")我收到以下錯誤的結果時:

ActionView::Template::Error (PGError: ERROR: column id_list.alias_0 does not exist) 

在看生成的SQL,我看到了一個別名正在ORDER BY語句各地創建時沒有要求:

messages.recipient_id = (32))) AS id_list ORDER BY id_list.alias_0 DESC) 

我已經無法找出使用「的find_by_sql」爲整個語句的解決方法短 - 這需要在應用了沉重的代價。

+1

也許'DISTINCT ON'有這種副作用。我不明白這個查詢應該顯示什麼。既不爲什麼你有'DISTINCT ON'和'GROUP BY'。 – 2011-06-04 17:30:56

+0

你是對的,GROUP BY代碼是不必要的。更新了問題和錯誤消息以反映這一點。此查詢返回按其會話標識分組的消息,以便顯示每個對話中的最後一條消息。 – neon 2011-06-04 17:41:10

回答

1

不要選這個,我只發佈,因爲評論張貼多行不顯示非常好。

我會寫一個「查詢,返回由他們conversation_id分組的消息,使顯示在每個會話的最後消息」是這樣的:

SELECT m.* 
FROM messages m 
    JOIN 
    (SELECT conversation_id 
      , MAX(created_date) AS maxdate 
     FROM messages 
     WHERE ... 
     GROUP BY conversation_id 
    ) AS grp 
    ON grp.conversation_id = m.conversation_id 
    AND grp.maxdate = m.created_date 
ORDER BY m.read_at DESC 

不知道如何能在Heroku上,或者如果完成它甚至可能,但它避免了DISTINCT ON。如果這是導致錯誤,它可能會有所幫助。

+2

供參考:Heroku的僅僅是一個的Ruby/Rails託管服務,他們使用PostgreSQL 8爲共享數據庫和PostgreSQL 9爲專用數據庫。訣竅是讓ActiveRecord無需手工操作派生表並使用'IN'即可生成合理的SQL。每個人都在不斷嘗試用一種語言中的API重新發明SQL,他們一直在做這件事。 – 2011-06-04 18:11:17

+0

@mu太短:thnx的信息。那麼,這可能是一個ActiveRecord問題?如何將SQL轉換爲Activerecord? – 2011-06-04 18:17:02

+0

該解決方案適用於Postgres和SQLite,其輸出實際上比我的代碼更精確。我會使用它,直到找到修復程序。謝謝! – neon 2011-06-04 18:47:56