SQLite to Postgres (Heroku) GROUP BY



以下SQLite代码按conversation_id对消息进行分组:

@messages=Message.where("messages.sender_id = (?) OR messages.recipient_id = (?)"
          , current_user.id, current_user.id).group("messages.conversation_id")

在转到Heroku时,Postgres无法识别此代码。查看日志,我被告知要将所有Message列添加到GROUP BY中,这将使我获得以下功能代码:

@messages=Message.where("messages.sender_id = (?) OR messages.recipient_id = (?)"
          , current_user.id, current_user.id).group("messages.conversation_id
          , messages.updated_at, messages.id, messages.sender_id
          , messages.recipient_id, messages.sender_deleted
          , messages.recipient_deleted, messages.body, messages.read_at
          , messages.ancestry, messages.ancestry_depth, messages.created_at")

只有此代码没有正确地按conversation_id分组。它只是输出所有符合WHERE条件的消息。有什么想法吗?

我使用DISTINCT ON:找到了一个功能性解决方案

@messages = Message.select("DISTINCT ON (messages.conversation_id) * ")
                   .where("messages.sender_id = (?) OR messages.recipient_id = (?)", current_user.id, current_user.id)
                   .group("messages.conversation_id, messages.updated_at, messages.id, messages.sender_id, messages.recipient_id, messages.sender_deleted, messages.recipient_deleted, messages.body, messages.read_at, messages.ancestry, messages.ancestry_depth, messages.created_at")

然而,这在SQLite中不起作用。建议下载Postgres并直接使用它,而不是在开发中使用SQLite代码和在生产中使用Postgres代码(Heroku)。

PostgreSQL要求对所有非聚合属性进行分组。分组是指你想要分组属性的唯一组合,所以询问所有信息是没有意义的。我不知道RoR,但你必须单独要求conversation_id(如果你需要的话,可以提供聚合信息)。但既然你在询问消息表上的所有信息,我想你可能真的想按对话ID排序?

相关内容

  • 没有找到相关文章

最新更新