我有以下型号:(简化)
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的想法让我感到畏缩,但我找不到任何其他解决方案。
我的配置: