【问题标题】:Mysql query in django viewDjango视图中的Mysql查询
【发布时间】:2016-10-05 22:21:41
【问题描述】:

我对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 的所有锻炼 ID。简而言之,在所有锻炼中达到强度等级 = 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 视图中反映相同的内容?

【问题讨论】:

  • 用户是否可以多次使用intensity_level=7 进行练习?
  • 是的,但这没关系,因为它的进度在强度级别=7之后没有记录

标签: mysql django django-rest-framework django-mysql


【解决方案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 大于或等于 min 并且 expr 小于或等于 到最大值,BETWEEN 返回 1,否则返回 0。这相当于 表达式 (min

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()

【讨论】:

  • range 更简单:exercise_id__range=(1, 7)
  • 不幸的是,最初的查询和答案中的查询给了我不同的结果。我最初的查询给了我“0”,而您的查询给了我“1”!我认为它考虑了 1 到 7 之间的任何运动 ID,强度级别为 7,而不是所有从 1 到 7 的运动 ID,强度级别为 '7'
  • 嗯,不。我的原始 sql 查询与原始 sql 查询完全等效。所有这些额外的 AND 都是多余的
  • 我想我应该重新构建我的最终要求:我想检索满足 exercise_id=1 对应的强度级别=7 的 user_id 的计数,以此类推,直到 7 为止。简而言之,用户在所有练习中都达到了 intensity_level=7。
  • 这是一个更复杂的查询。请使用此信息更新您的问题,不要忘记发布您的 django 模型。
猜你喜欢
  • 2011-04-09
  • 1970-01-01
  • 2016-10-27
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 2011-11-24
  • 2012-12-02
  • 1970-01-01
相关资源
最近更新 更多