【问题标题】:ORDER BY issue in Postgres (Heroku)Postgres (Heroku) 中的 ORDER BY 问题
【发布时间】:2011-06-04 17:04:23
【问题描述】:

以下代码适用于 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”之外,我还没有找到解决方法——这对应用程序造成了沉重的负担。

【问题讨论】:

  • 也许DISTINCT ON 有这个副作用。我不明白这个查询应该显示什么。也不是为什么你同时拥有DISTINCT ONGROUP BY
  • 你是对的,GROUP BY 代码是不必要的。更新了问题和错误消息以反映这一点。此查询返回按其会话 ID 分组的消息,以便显示每个会话中的最后一条消息。

标签: sql ruby-on-rails ruby-on-rails-3 postgresql heroku


【解决方案1】:

不要投这个,我只发因为在cmets中发很多行显示效果不好。

我会编写一个“返回按其会话 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。如果这是导致错误的原因,它可能会有所帮助。

【讨论】:

  • 仅供参考:Heroku 只是一个 Ruby/Rails 托管服务,他们将 PostgreSQL 8 用于共享数据库,将 PostgreSQL 9 用于专用数据库。诀窍是让 ActiveRecord 生成合理的 SQL,而无需手动执行派生表并使用 IN。每个人都在尝试使用语言内 API 重新发明 SQL,但他们一直做得很糟糕。
  • @mu 太短:谢谢信息。那么,这可能是 ActiveRecord 问题吗?如何将 SQL 转换为 Activerecord?
  • 这个解决方案有效(适用于 Postgres 和 SQLite),它的输出实际上比我的代码更准确。在找到修复程序之前,我会一直使用它。谢谢!
  • 是的,这确实是一个 ActiveRecord 问题。在这些日子里,我们将获得一个足够聪明的 ORM,可以使用 SQL 作为其 API :) 即使你不想要它,我也会支持你,通常让 ActiveRecord 表现得明智的唯一方法是推动它让开,直接进入 SQL。
猜你喜欢
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-11
  • 1970-01-01
相关资源
最近更新 更多