Sql Rails 3-得分最高的用户查询-需要新方法

Sql Rails 3-得分最高的用户查询-需要新方法,sql,ruby-on-rails-3,activerecord,Sql,Ruby On Rails 3,Activerecord,我有两个模型:用户和分数>一个用户有很多分数 用户模型包含有关用户的一般信息-名称、位置等。 模型分数包含日期、分数和质量分数值 我需要的是一种有效的方法,以获得一个20个独特的用户名单,在给定的日期范围内,他们的得分最高。如果用户1拥有前3名的分数,我只希望他们的最高分数与他们的名字相对应,而用户2的最高分数与他们的名字相对应。我的测试数据有000个用户和000000个分数 在其他SO用户的帮助下,我成功地实现了这一点: @top_users = User.limit(20).

我有两个模型:用户和分数>一个用户有很多分数

用户模型包含有关用户的一般信息-名称、位置等。 模型分数包含日期、分数和质量分数值

我需要的是一种有效的方法,以获得一个20个独特的用户名单,在给定的日期范围内,他们的得分最高。如果用户1拥有前3名的分数,我只希望他们的最高分数与他们的名字相对应,而用户2的最高分数与他们的名字相对应。我的测试数据有000个用户和000000个分数

在其他SO用户的帮助下,我成功地实现了这一点:

@top_users  = User.limit(20).
        select("`users`.*").
        joins(:scores).
        where("datetime_utc >= ? AND datetime_utc <= ?", @utc_time_slot , @utc_time_slot_end).
        group('user_id').
        order("max(quality_score) DESC, max(score) DESC")
感谢Mario Visic和Chris Bailey,但查询需要花费令人无法接受的长时间运行——我不禁想到有一种更有效的方法来实现这一点


有什么建议/想法吗?谢谢

最快的解决方案是将用户的最佳分数反规范化到users表中,并将其索引,但如果反规范化对您来说不是一个实用的选项,我建议您在scores.quality_score和/或scores.datetime_utc上创建一个索引,这取决于哪个索引将更好地缩小查询范围。然后我将查询拆分为2,如下所示:

top_user_scores = Score.limit(20).
    where("datetime_utc >= ? AND datetime_utc <= ?", @utc_time_slot , @utc_time_slot_end).
    group('user_id').
    order("max(quality_score) DESC, max(score) DESC")
User.find(top_user_scores.map(&:user_id))

最快的解决方案是将用户的最佳分数反规范化到users表中,并对其进行索引,但如果反规范化对您来说不是一个实用的选项,我建议您在scores.quality_score和/或scores.datetime_utc上创建一个索引,这取决于哪个索引可以更好地缩小查询范围。然后我将查询拆分为2,如下所示:

top_user_scores = Score.limit(20).
    where("datetime_utc >= ? AND datetime_utc <= ?", @utc_time_slot , @utc_time_slot_end).
    group('user_id').
    order("max(quality_score) DESC, max(score) DESC")
User.find(top_user_scores.map(&:user_id))

质量分数和风格分数的区别是什么?就像速度分数和风格分数一样——令人烦恼的是,我需要两者……你的分数表中有这些字段的索引吗?是的,这两个都有索引,但是它们对查询的性能没有什么影响。您应该索引的字段可能是分数。user\u id连接使用的外键和where子句使用的datetime\utc质量分数和分数有什么区别?就像速度分数和风格分数一样,我需要它这两个…您的分数表中的这些字段都有索引吗?是的,这两个字段都有索引,但它们对查询的性能没有任何影响。您应该索引的字段可能是分数。user\u id where clausehi patrick使用的join和datetime\u utc使用的外键-谢谢。我会测试它,但只是盯着看,这会不会给我们提供排名前20位的用户可能是哦-而且,在这种情况下,非规范化是不存在的。。。由于您不知道将要请求的时间范围…@user1051849-组“user_id”将确保您每个userhi patrick只获得一行-谢谢。我会测试它,但只是盯着看,这会不会给我们提供排名前20位的用户可能是哦-而且,在这种情况下,非规范化是不存在的。。。由于您不知道将要请求的时间范围…@user1051849-组“user_id”将确保每个用户只获得一行