根据测试分数和时间对用户进行排名

时间:2014-09-23 23:01:15

标签: django django-models

我有以下型号:(简化)

class TestResults(models.Model):
    user = models.ForeignKey(User)
    test = models.ForeignKey(Test)
    score = models.FloatField()
    time = models.FloatField()
    # ... more fields

我希望获得一个TestResult的列表,该列表大约有一个test,过滤掉那些得分为0,获得每个用户获得的最佳结果,并将所有结果从最佳到最差排序。 Best被定义为得分最高,如果得分相同,则时间最短。

我无法在一次查询中找到使用模型和查询集的理智解决方案。

目前,我在没有任何其他解决方案的情况下尝试了几天后使用这个原始SQL(简化版):

SELECT res.id, res.user_id, res.test_id, res.score, res.time, res.more_fields...
FROM (
    SELECT user_id, MAX(score) AS score
    FROM app_testresult
    WHERE test_id = %s AND score > 0
    GROUP BY user_id
) AS highscore INNER JOIN (
    SELECT user_id, score, MIN(time) as time
    FROM app_testresult
    WHERE test_id = %s
    GROUP BY user_id, score
) AS fastest
        ON (highscore.user_id = fastest.user_id AND highscore.score = fastest.score)
    INNER JOIN app_testresult as res
        ON (res.user_id = fastest.user_id AND res.time = fastest.time)
GROUP BY fastest.user_id
ORDER BY res.score DESC, res.time ASC

这个SQL的想法让我感到畏缩,但我找不到任何其他解决方案。

我的配置:

  • Django版本:1.6.7
  • 数据库:MySQL 5.5

0 个答案:

没有答案