【问题标题】:How best to work around PostgreSQL's stricter grouping如何最好地解决 PostgreSQL 更严格的分组问题
【发布时间】:2009-10-25 00:16:22
【问题描述】:

我正在尝试从使用 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 子句,我将不胜感激!

谢谢!

【问题讨论】:

  • 除 MySQL 之外,所有其他 db 都要求您指定所有未应用聚合函数的列以包含在 GROUP BY 语句中。

标签: sql ruby-on-rails postgresql


【解决方案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

【讨论】:

  • 看起来可以!谢谢!而且我可能会补充......我并不想说 PostgreSQL 执行标准过于严格。如果有什么我试图暗示 MySQL 没有严格遵守标准,我不得不改变我的思维方式。
猜你喜欢
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-27
相关资源
最近更新 更多