【问题标题】:Rails & Postgres - Are queries with count columns really this complex?Rails & Postgres - 带有计数列的查询真的这么复杂吗?
【发布时间】:2010-11-24 13:56:30
【问题描述】:

我的应用中有以下模型(仅显示相关范围):

class Audition < ActiveRecord::Base
  def self.with_new_applications
    columns = self.column_names.map{|c| "auditions.#{c}" }.join(', ')

    select(columns).joins(:applications).merge(Application.unreplied).group(columns)
  end
end

class Application < ActiveRecord::Base
  def self.unreplied
    columns = Application.column_names.map{|c| "applications.#{c}" }.join(', ')

    select("#{columns}, count(messages.id) as message_count").
      joins('left outer join messages on messages.application_id = applications.id').
      group(columns).
      having('count(messages.id) = 0')
  end
end

由于使用 postgreSQL,与 MySQL 相比,由于需要包含计数列/分组的所有列,因此查询似乎变得不必要地复杂。

我错过了什么吗?对我来说,它似乎不太“像 Rails”。

能否以更简单的方式执行这些查询?

谢谢

【问题讨论】:

  • 为什么你认为 PostgreSQL 中的查询比 MySQL 中的更复杂? ANSI-SQL 是 ANSI-SQL,对于简单的 COUNT 而言,在两个数据库中的工作方式相同
  • @Frank Heikens:我认为他的意思是在 MySQL 中,您可以使用带有 GROUP BY 的隐藏列:dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html 但在 PostgreSQL 中,您必须列出所有列,否则以另一种方式编写查询.
  • 差不多就是这样,使用 PostgreSQL 时你不得不在每个查询中手动输入列,这似乎很奇怪。也许我刚刚被 ActiveRecord/ARel 魔法宠坏了,所以当看似简单的任务变得更加复杂时,它会显得很奇怪。撇开这些不谈,在 Rails 方面,我可以做些什么不同的事情来获得更优雅的解决方案吗?
  • 这与(几乎)所有其他品牌的数据库相同,MySQL 是个例外。 PostgreSQL 9.1 版(2011 年发布)将对 GROUP BY 的主键有功能依赖。这将解决您的问题,但您必须等待...depesz.com/index.php/2010/08/08/…
  • 您可能想阅读这篇文章,了解从 GROUP BY 中省略列的问题:rpbouman.blogspot.com/2007/05/debunking-group-by-myths.html

标签: ruby-on-rails ruby postgresql named-scope


【解决方案1】:

也许您可以使用 ActiveRecord :counter_cache 从完全不同的角度解决问题?例如

belongs_to :application, :counter_cache => true

您可以通过这种方式进行简短、简单且高效的查询。

【讨论】:

  • 这是一个很好的建议,它会变得更简单。干杯
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-14
  • 2018-11-24
  • 2016-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多