无法对 Rails 上 Ruby 中的不同值求和
Can't SUM DISTINCT values in Ruby on Rails
我有 4 个 table:用户、锻炼、练习和结果。 "User" 为 "Exercises" 发布了 "Results",链接到单个 "Workout"。但是当用户发布结果时,由于有多个练习,一个练习的结果可以与唯一的 "post_id" 相关联。我想知道用户根据他们提供的 "post_ids" 可以链接到 "Workouts" table 的总分钟数,其中 "workout_duration" 列显示了多少分钟每次锻炼持续。这是一些示例数据,在这种情况下,锻炼 (workout_id=1) 有两个锻炼,workout_duration 为 1 分钟。
结果:
user_id| workout_id| post_id| exercise_id| number_of_reps|
-------+-----------+--------+------------+---------------+
123| 1 | 1| 1 | 18|
123| 1 | 1| 2 | 29|
123| 1 | 2| 1 | 15|
123| 1 | 2| 2 | 30|
123| 1 | 3| 1 | 20|
123| 1 | 3| 2 | 28|
-------+-----------+--------+------------+---------------+
锻炼:
workout_id| workout_duration|
----------+-----------------+
1| 1|
我试图根据下面的查询检索总分钟数,但当我希望它 return 值为 3 时,它 return 总和为 6...我认为这是因为 SUM 没有考虑 DISTINCT post_ids...而只是对所有 post_ids 求和。
@user = User.find(current_user)
@total_minutes = @user.results.includes(:workout).select(:post_id).distinct.sum(:workout_duration)
我到处寻找解决方案都无济于事...有什么想法吗?
编辑:
这是从上面的查询生成的 SQL:
SELECT DISTINCT SUM(workout_duration)
FROM "results"
LEFT OUTER JOIN "workouts" ON "workouts"."id" = "results"."workout_id"
WHERE "results"."user_id" = ? [["user_id", 123]]
我使用原始 SQL:
解决了这个问题
@minute_total = ActiveRecord::Base.connection.execute(minute_query)[0][0]
private
def minute_query
"SELECT SUM(workout_duration)
FROM (SELECT DISTINCT(results.post_id), results.user_id, workouts.workout_duration
FROM results LEFT OUTER JOIN workouts ON results.workout_id = workouts.id
WHERE results.user_id = #{@user.id})"
end
我有 4 个 table:用户、锻炼、练习和结果。 "User" 为 "Exercises" 发布了 "Results",链接到单个 "Workout"。但是当用户发布结果时,由于有多个练习,一个练习的结果可以与唯一的 "post_id" 相关联。我想知道用户根据他们提供的 "post_ids" 可以链接到 "Workouts" table 的总分钟数,其中 "workout_duration" 列显示了多少分钟每次锻炼持续。这是一些示例数据,在这种情况下,锻炼 (workout_id=1) 有两个锻炼,workout_duration 为 1 分钟。
结果:
user_id| workout_id| post_id| exercise_id| number_of_reps|
-------+-----------+--------+------------+---------------+
123| 1 | 1| 1 | 18|
123| 1 | 1| 2 | 29|
123| 1 | 2| 1 | 15|
123| 1 | 2| 2 | 30|
123| 1 | 3| 1 | 20|
123| 1 | 3| 2 | 28|
-------+-----------+--------+------------+---------------+
锻炼:
workout_id| workout_duration|
----------+-----------------+
1| 1|
我试图根据下面的查询检索总分钟数,但当我希望它 return 值为 3 时,它 return 总和为 6...我认为这是因为 SUM 没有考虑 DISTINCT post_ids...而只是对所有 post_ids 求和。
@user = User.find(current_user)
@total_minutes = @user.results.includes(:workout).select(:post_id).distinct.sum(:workout_duration)
我到处寻找解决方案都无济于事...有什么想法吗?
编辑: 这是从上面的查询生成的 SQL:
SELECT DISTINCT SUM(workout_duration)
FROM "results"
LEFT OUTER JOIN "workouts" ON "workouts"."id" = "results"."workout_id"
WHERE "results"."user_id" = ? [["user_id", 123]]
我使用原始 SQL:
解决了这个问题 @minute_total = ActiveRecord::Base.connection.execute(minute_query)[0][0]
private
def minute_query
"SELECT SUM(workout_duration)
FROM (SELECT DISTINCT(results.post_id), results.user_id, workouts.workout_duration
FROM results LEFT OUTER JOIN workouts ON results.workout_id = workouts.id
WHERE results.user_id = #{@user.id})"
end