Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite到Postgres(Heroku)分组方式_Sql_Ruby On Rails_Ruby On Rails 3_Postgresql_Heroku - Fatal编程技术网

SQLite到Postgres(Heroku)分组方式

SQLite到Postgres(Heroku)分组方式,sql,ruby-on-rails,ruby-on-rails-3,postgresql,heroku,Sql,Ruby On Rails,Ruby On Rails 3,Postgresql,Heroku,以下SQLite代码按会话id对消息进行分组: @messages=Message.where("messages.sender_id = (?) OR messages.recipient_id = (?)" , current_user.id, current_user.id).group("messages.conversation_id") 在转到Heroku时,Postgres无法识别此代码。查看日志,我被告知通过以下功能代码将所有消息列添加到组中: @messa

以下SQLite代码按会话id对消息进行分组:

@messages=Message.where("messages.sender_id = (?) OR messages.recipient_id = (?)"
          , current_user.id, current_user.id).group("messages.conversation_id")
在转到Heroku时,Postgres无法识别此代码。查看日志,我被告知通过以下功能代码将所有消息列添加到组中:

@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")

只有此代码不能正确地按对话id分组。它只输出满足WHERE条件的所有消息。有什么想法吗?

PostgreSQL要求您对所有非聚合属性进行分组。分组就是说您需要分组属性的唯一组合,因此询问所有信息是没有意义的。我不知道RoR的情况,但您必须单独请求
对话id
(如果您需要,可以提供聚合信息)。但是,由于您要查询messages表中的所有信息,我想您可能真的想按对话ID排序?

我使用
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)。

否,按对话id排序只会以不同的方式排序。我试图在每个对话中显示的最后一条消息(这是一组具有相同对话id的消息)