如何最好地解决PostgreSQL更严格的分组问题

时间:2009-10-25 00:16:22

标签: sql ruby-on-rails postgresql

我正在尝试从使用MySQL转换为使用PostgreSQL。我有这种结构:

用户(实体) - >关注 - >业务(实体) - >故事

用户需要查看他们关注的商家发布的所有新闻更新。以下查询适用于MySQL,因为它只是通过story.id显示所有相关的故事和组。不幸的是,由于PostgreSQL在解释SQL标准方面更为文字化,如果我想做GROUP BY子句,我需要使用DISTINCT子句单独询问每个字段。

Story.find(:all, :joins => { :entity => { :followers => :follower } }, :conditions => ['followers_follows.id = ?', 4], :group => 'stories.id')

PostgreSQL吐出:“错误:列”stories.entity_id“必须出现在GROUP BY子句中或用于聚合函数”

必须单独指定每个字段似乎不够优雅。如果有人能给我一个干净的方法来获得与MySQL相同的结果而不必求助于获取重复的字段(删除组)或必须指定每个单独的字段以及DISTINCT子句,我会很感激! / p>

谢谢!

1 个答案:

答案 0 :(得分:1)

好吧,我当然不会说PostgreSQL对SQL标准的解释过于严格。事实上,这是相反的方式。

这是一个可能的解决方案:

Story.all( :joins => { :entity => { :followers=> :follower } },
           :conditions => ['followers_follows.id = ?', 4], 
           :group => Story.column_names.map { |c| "stories.#{c}" }.join(', ') )

但是有很多替代查询。几个星期前我在博客上发表了这篇文章。这是帖子:http://awesomeful.net/posts/72-postgresql-s-group-by