Postgres:使用GROUP BY和ORDER时出错(在heroku上)

时间:2011-11-14 17:43:04

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

我正在尝试解决我的heroku问题,它似乎有问题

  

我们很抱歉,但出了点问题。       我们已经收到有关此问题的通知,我们很快就会对其进行审核。

我有什么错误以及如何克服它? 我怎样才能解释这些Heroku日志?

ActionView::Template::Error (PGError: ERROR:  column "microposts.created_at" must appear     in the GROUP BY clause or be used in an aggregate function
2011-11-14T17:33:07+00:00 app[web.1]: : SELECT category FROM "microposts" GROUP BY category ORDER BY microposts.created_at DESC):
2011-11-14T17:33:07+00:00 app[web.1]:     2: <% @categories= Micropost.select("category").group("category")%>
2011-11-14T17:33:07+00:00 app[web.1]:     3: <% unless @categories.nil? %>
2011-11-14T17:33:07+00:00 app[web.1]:     4: 
2011-11-14T17:33:07+00:00 app[web.1]:     5: <ul><% @categories.each do |category| %>
2011-11-14T17:33:07+00:00 app[web.1]:     6: <li><%= link_to category.category, :controller =>"microposts", :category => category.category, :method => 'category_list' %></li>
2011-11-14T17:33:07+00:00 app[web.1]:     7: <% end %>
2011-11-14T17:33:07+00:00 app[web.1]:     8: </ul>

微博模型(新添加)

 class Micropost < ActiveRecord::Base
belongs_to :users
default_scope :order => 'microposts.created_at DESC'


attr_accessible :title,:content,:category

validates :user_id, :presence => true
validates :title,    :presence => true,
                     :length => {:maximum =>500}                            
validates :content,  :presence => true,
                     :length => {:maximum =>3000}                           
validates :category, :presence => true
end

2 个答案:

答案 0 :(得分:4)

您当前的问题是您为PostgreSQL生成了无效的SQL:

SELECT category FROM "microposts" GROUP BY category ORDER BY microposts.created_at DESC

您的ORDER BY与查询的其余部分不匹配。您不能在分组查询中使用列,除非该列也已分组,或者该列出现在聚合函数中,这就是错误消息的含义。原因是当一组行由GROUP BY子句组合时,PostgreSQL将不知道要使用哪一行created_at;一些数据库会默默地自己选择一行,PostgreSQL更喜欢严格,希望你自己消除歧义。

尝试自己指定订单:

@categories = Micropost.select("category").group("category").order("category")

另一个选择是使用DISTINCT而不是GROUP BY来避免重复:

@categories = Micropost.select('DISTINCT(category)')
顺便说一句,你真的不应该在视图中做那种事情,你可能想把它移到你的控制器上。

您真正的问题是,您在一个数据库上进行开发,而在另一个数据库上进行部署。我建议您将开发环境切换到PostgreSQL 8.3(如果要部署到Heroku共享数据库)或PostgreSQL 9.0(如果要部署到专用数据库)。

答案 1 :(得分:2)

您是否在使用MySQL开发应用程序? Heroku不包括MySQL。它使用postgreSQL。在这里查看这个问题 - PostgreSQL GROUP BY different from MySQL?

我引用 -

  

MySQL完全不符合标准的GROUP BY可以由Postgres的DISTINCT ON模拟。考虑一下:

     

mysql:

  SELECT a,b,c,d,e FROM table GROUP BY a
     

每个a的值提供1行(哪一个,你真的不知道)。实际上你可以猜到,因为MySQL不知道哈希聚合,所以它可能会使用排序...但它只会对a进行排序,因此行的顺序可能是随机的。除非它使用多列索引而不是排序。好吧,无论如何,它没有被查询指定。

     postgres:

   SELECT DISTINCT ON (a) a,b,c,d,e FROM table ORDER BY a,b,c
     

这为a每个值提供1行,该行将是根据查询指定的ORDER BY排序中的第一行。简单。