Mysql 减少查询-关联条件?

Mysql 减少查询-关联条件?,mysql,ruby-on-rails,Mysql,Ruby On Rails,我需要一些帮助来优化以下方法。随着我的数据库规模扩大到3K用户和100K训练,查询成本变得太高。不幸的是,我的SQL技能还很初级 该方法返回给定训练相对于同性别的训练的排名,以及该性别的训练总数。为了简化此示例,我删除了其他适用于训练的条件: Class Person has_many :workouts named_scope :men, :conditions => {:male => true} end Class Workout belongs_to :pers

我需要一些帮助来优化以下方法。随着我的数据库规模扩大到3K用户和100K训练,查询成本变得太高。不幸的是,我的SQL技能还很初级

该方法返回给定训练相对于同性别的训练的排名,以及该性别的训练总数。为了简化此示例,我删除了其他适用于训练的条件:

Class Person
  has_many :workouts
  named_scope :men, :conditions => {:male => true}
end

Class Workout
  belongs_to :person
  named_scope :by, lambda {|person_id| {:conditions => {:person_id => person_id}}}

  def rank_by_gender
    people = Person.men.collect{|p| p.id}
    { :place => 
        Workout.by(people).count(:conditions => ["time < ?", self.time]) + 1
      :entries => 
        Workout.by(people).count() }
  end
end 
班级人员
有很多:锻炼
命名的_作用域:men,:conditions=>{:male=>true}
结束
课堂锻炼
属于某人
命名为_scope:by,lambda{| person_id{:conditions=>{:person_id=>person_id}}
按性别划分的def等级
人=人。人。收集{p{p.id}
{:place=>
锻炼。按(人)。计数(:条件=>[“时间<?”,自我时间])+1
:条目=>
Workout.by(people).count()}
结束
结束
  • Person.men现在返回数千条记录。有没有一种方法可以将该查询与count查询结合起来,可能是在people表上使用一个连接,并在:male属性上使用

  • 是否有方法将人员关联的条件放入传递给count方法的条件中

  • 除此之外,有没有人看到其他方法可以减少此方法中数据库查询的大小和时间


这应该适合您:

  { 
    :place => Workout.joins(:person).where(["`workouts`.time < ? AND `people`.male = ?", self.time, true]).size,
    :entries => Workout.joins(:person).where(:people => {:male => true}).size 
  }
{
:place=>Workout.joins(:person)。其中([“`workouts`.time<>和`people`.male=?”,self.time,true])大小,
:entries=>Workout.joins(:person).where(:people=>{:male=>true}).size
}

这应该适合您:

  { 
    :place => Workout.joins(:person).where(["`workouts`.time < ? AND `people`.male = ?", self.time, true]).size,
    :entries => Workout.joins(:person).where(:people => {:male => true}).size 
  }
{
:place=>Workout.joins(:person)。其中([“`workouts`.time<>和`people`.male=?”,self.time,true])大小,
:entries=>Workout.joins(:person).where(:people=>{:male=>true}).size
}

谢谢。忘了提及我的应用程序仍然停留在rails 2.2上,但很容易将语法更改为“训练”。所有(:joins=>:person,:conditions=>[…])因为我需要的只是计数,这就是我完成的:训练。计数(:joins=>:person,:conditions=>[…])拍摄,我本想在这些内容的末尾加上.size()。谢谢。忘了提及我的应用程序仍然停留在rails 2.2上,但很容易将语法更改为“训练”。所有(:joins=>:person,:conditions=>[…])因为我需要的只是计数,这就是我完成的:训练。计数(:joins=>:person,:conditions=>[…])拍摄,我本想在这些内容的末尾加上.size()。