2009-10-25 112 views
0

我想从使用MySQL转换到使用PostgreSQL。我有这种类型的结构:如何最好地解决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的吐出:“ERROR:列‘stories.entity_id’必须出现在GROUP BY子句或聚合函数中使用”

不必指定每个字段单独看起来不太优雅。如果任何人都可以给我一个干净的方式来获得与MySQL相同的结果,而不必诉诸重复的字段(删除组),或者必须指定每个单独的字段以及DISTINCT子句,我将不胜感激!

谢谢!

+3

除了MySQL之外,其他每个数据库都要求你指定所有没有应用于它们的聚合函数的列,以包含在GROUP BY语句中。 – 2009-10-25 00:49:37

回答

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

+0

看起来它会起作用!谢谢! 而且我可能会添加......我并不打算说PostgreSQL太严格地执行该标准。如果有什么我试图暗示MySQL不严格遵守标准,我不得不改变我的思维方式。 – rwl4 2009-10-26 04:09:10