1

我对mysql的了解不多。我的 django 模型如下:

 class Exercise_state(models.Model):
     exercise = models.ForeignKey(Exercise, blank=True, null=True)
     user = models.ForeignKey(User, blank=True, null=True) 
     intensity_level = models.IntegerField(default='1')
     progress = models.IntegerField(default='0')
     current_date = models.DateField(auto_now=True)
     user_rating = models.IntegerField(default='0')

我想检索满足 exercise_id=1 对应的强度等级 = 7 的 user_id 的计数,以此类推,直到 7 为止。简而言之,在所有练习中达到强度等级 = 7 的用户。

我写了一个查询,如下所示:

select count(user_id) from demo_exercise_state where 
exercise_id=1 and intensity_level=7 and
exercise_id=2 and intensity_level=7 and
exercise_id=3 and intensity_level=7 and 
exercise_id=4 and intensity_level=7 and
exercise_id=5 and intensity_level=7 and
exercise_id=6 and intensity_level=7 and
exercise_id=7 and intensity_level=7;

据我可以直接从我的数据库中交叉检查结果,还没有用户完成他的训练(即在所有锻炼类型中都达到了强度级别=7),所以它返回计数为“0”。

我相信这可以优化查询,因为有很多重复,但我不确定如何。

我也想在我的 django 视图中执行相同的操作(即获得相同的结果)。我有类似的东西

all_exercise_finish_count = Exercise_state.objects.filter(exercise_id=1, intensity_level=7).count()

我怎样才能在这个 django 视图中反映相同的内容?

4

1 回答 1

1

更新 完全改变了我的答案,因为评论中的后续讨论清楚地表明,OP 的意图与最初看起来的完全不同。

您可以通过以下方式找到完成所有 7 强度 7 练习的用户

from django.db.models.import Count

Exercise_state.objects.annotate(
    c = Count('exercise').filter(c=7, exercise_id= 7)

答案的第一种形式如下:

原始原始查询可以通过between大大简化

expr 介于最小值和最大值之间

如果 expr 大于或等于 min 并且 expr 小于或等于 max,则 BETWEEN 返回 1,否则返回 0。这相当于表达式 (min <= expr AND expr <= max) 如果所有参数都是同类型。否则,类型转换将根据第 13.2 节“表达式求值中的类型转换”中描述的规则进行,但适用于所有三个参数。

select count(user_id) from demo_exercise_state where 
exercise_id BETWEEN 1 and 7 AND intensity_level=7

django 查询可以简单地是

all_exercise_finish_count = Exercise_state.objects.filter(exercise_id__gte=1, intensity_level=7, excercise_id__lte=7).count()
于 2016-06-06T10:39:34.050 回答