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

Django 根据测试分数和时间对用户进行排名,django,django-models,Django,Django Models,我有以下模型:(简化) 我想得到一个关于某个测试的TestResult列表,过滤掉那些分数为0的,取每个用户得到的最好结果,并将所有结果从最好到最差排序。最佳被定义为得分最高,如果得分相同,则时间最少 我还没能找到一个在一个查询中使用模型和查询集的合理解决方案 目前,在没有任何其他解决方案的情况下尝试了几天之后,我正在使用此原始SQL(简化): SELECT res.id, res.user_id, res.test_id, res.score, res.time, res.more_field

我有以下模型:(简化)

我想得到一个关于某个测试的
TestResult
列表,过滤掉那些分数为0的,取每个用户得到的最好结果,并将所有结果从最好到最差排序。最佳被定义为得分最高,如果得分相同,则时间最少

我还没能找到一个在一个查询中使用模型和查询集的合理解决方案

目前,在没有任何其他解决方案的情况下尝试了几天之后,我正在使用此原始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
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