我有以下MySQL查询,它返回1列,称为填充了整数值的点
SELECT SUM(points) FROM (SELECT FLOOR((sum(case when correct=1 then correct else 0 end)/COUNT(*))*100) as points FROM answersheets WHERE user_id = 133 GROUP BY exercise_id, user_id) as points
我已经把它作为一个ruby on rails scope得到了以下点,这是没有最终总和得到总数的子查询:
scope :base_points, ->(user_id) { select('FLOOR((SUM(case when correct=1 then correct else 0 end)/COUNT(*))*100) as points').where('user_id = ?', user_id).group(:exercise_id, :user_id) }
但那只是返回
2.1.0 :073 > p = Answersheet.base_points(133)
Answersheet Load (0.4ms) SELECT FLOOR((SUM(case when correct=1 then correct else 0 end)/COUNT(*))*100) as points FROM `answersheets` WHERE (user_id = 133) GROUP BY exercise_id, user_id
=> #<ActiveRecord::Relation [#<Answersheet id: nil>, #<Answersheet id: nil>, #<Answersheet id: nil>]>
什么可能导致rails控制台和mysql之间的区别?我的猜测是我的格式错误
基于以下所选答案的方法
def points
query = Answersheet.select('FLOOR((SUM(case when correct=1 then correct else 0 end)/COUNT(*))*100) as points').where('user_id = ?', self.id).group(:exercise_id, :user_id)
return query.sum(&:points)
end
注意:我可以这样做@ user.points所以我已经将代码移到了用户模型
答案 0 :(得分:0)
尝试将范围更改为:
scope :base_points, ->(user_id) { select('FLOOR((SUM(case when correct=1 then correct else 0 end)/COUNT(*))*100) as points').where('user_id = ?', user_id).group(:exercise_id, :user_id).first[:points] }
我认为最好把它写成一种方法:
class Answersheet < ActiveRecord::Base
def self.base_points(user_id)
scoped.select('FLOOR((SUM(case when correct=1 then correct else 0 end)/COUNT(*))*100) as points').
where('user_id = ?', user_id).
group(:exercise_id, :user_id).
first[:points]
end