0
SELECT `av`.`answer_id`, SUM(IF(`av`.`helpful`=1, 1, -1)) as `score` 
FROM `questions_answervote` AS `av` 
JOIN `questions_answer` AS `a` 
ON `a`.`id`=`av`.`answer_id` AND `a`.`question_id`='775819' 
GROUP BY `av`.`answer_id` 
HAVING SUM(IF(`av`.`helpful`=1, 1, -1)) > 0

QuestionAnswerおよびの 3 つのモデルがありAnswerVoteます。すべての質問には一連の Answers があり、すべての Answer には一連の AnswerVotes があります。AnswerVote にはhelpfulブール値のフィールドがあります。

私がやろうとしているscoreのは、回答ごとに a を計算することにより、質問に対するすべての役立つ回答を取得することです (+1 for help=True、-1 for help=False)。スコアが 0 より大きい場合、Answer は役に立ちます。

どんな助けでも大歓迎です!

4

2 に答える 2

2

次のものがある場合:

from django.db import models

class Question(models.Model):
    data = models.CharField(max_length=30)

class Answer(models.Model):
    question = models.ForeignKey(Question)

    def __str__(self):
        return str(self.__dict__)

class AnswerVotes(models.Model):
    answer = models.ForeignKey(Answer)
    helpful = models.SmallIntegerField(default=0)

    def __str__(self):
        return str(self.__dict__)

回避策のように思えるかもしれませんが、すべての投票の有用性の平均を単純に実行しないのはなぜですか。-1 から 1 の範囲ではなく、DB の生の値で 0 から 1 の間のどこかになります。0.5 を中間点として扱うだけで、同じ動作が得られるはずです。

Answer.objects.annotate(score = Avg('answervotes__helpful'))

    {'score': None, 'id': 1, 'question_id': 1}
    {'score': 1.0, 'id': 2, 'question_id': 1}
    {'score': 0.5, 'id': 3, 'question_id': 1}
    {'score': 0.3333333333333333, 'id': 4, 'question_id': 2}
    {'score': 0.5, 'id': 5, 'question_id': 3} 
    {'score': 0.4, 'id': 6, 'question_id': 3}

Answer.objects.annotate(score = Avg('answervotes__helpful')).filter(score__gte=0.5)

    {'score': 1.0, 'id': 2, 'question_id': 1}
    {'score': 0.5, 'id': 3, 'question_id': 1}
    {'score': 0.5, 'id': 5, 'question_id': 3}
于 2012-06-01T01:49:49.570 に答える
1

Django の ORM はHAVING.

于 2012-05-31T19:33:57.407 に答える