1

私はmysqlの知識があまりありません。私のジャンゴモデルは次のとおりです。

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

私は、すべての運動 ID について、運動 ID = 1 に対応する強度レベル = 7 などを満たすユーザー ID の数を取得したいと考えています。つまり、すべての運動で強度レベル = 7 に達したユーザーです。

次のようなクエリを1つ作成しました。

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)

答えの最初の形式は次のとおりです。

元の生のクエリは、次の間で大幅に簡素化できます

expr BETWEEN min AND max

expr が min 以上で expr が max 以下の場合、BETWEEN は 1 を返し、それ以外の場合は 0 を返します。これは、すべての引数が同じタイプの。それ以外の場合は、セクション13.2「式の評価における型変換」で説明されている規則に従って型変換が行われますが、3 つの引数すべてに適用されます。

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 に答える