我试图根据某些条件来计算某个字段。但我还没有达到预期的效果。
表格::测验问题:
qq_id | qq_type | qq_title
----------------------------------------------------
1 | 1 | This is a multiple choice question
2 | 2 | This is a single choice question
3 | 4 | This is a descriptive type question
表格=测验问题详细信息:
qqd_id | qqd_question_id | qqd_option_text | qqd_option_is_answer
-----------------------------------------------------------------
1 | 1 | Yes | 1
2 | 1 | No | 2
3 | 1 | May Be | 1
4 | 2 | Yes | 1
5 | 2 | No | 2
表格:测验参与者答案:
qa_id | qa_quiz_id| qa_participant_id | qa_question_id | qa_answer**
-------------------------------------------------------------------------------
1 | 1 | 3 | 1 | 1
2 | 1 | 3 | 1 | 3
3 | 1 | 3 | 2 | 4
4 | 1 | 3 | 3 | null
**字段qa_answer是测验问题详情表的qqd_id。
问题(qq_id = 1)是一个多项选择题,因此答案不止一个。 问题(qq_id = 2)只有一个答案,问题(qq_id = 3)将是一个描述性问题。
admin定义的答案存储在问题详情表中,我们可以看到qqd_question_id = 1有3个答案,其中2个是正确的(qqd_id 1& 3)
计算正确答案数和总答案数,我得到的总答案数为3(这是错误的,预期为2,因为问题ID(qq_id = 1是单个问题,但有多个)答案))和总回答数为3(这是正确的)。
我正在使用laravel 5.4框架。我使用以下查询测试查询。
注意:出于测试目的,我在表中添加了附加字段(qa_is_correct_answer)(没有与详细信息表连接),请忽略它。
DB::table('quiz_answers AS QA')
->select(DB::Raw('QA.*, SUM(QA.qa_is_correct_answer = 1) AS correct, COUNT(DISTINCT QA.qa_question_id) AS total_answered'))
->where('QA.qa_quiz_id',$quizID)
->where('QA.qa_participant_id',$participantID)
->groupBy('QA.qa_quiz_id')
->get();
答案 0 :(得分:1)
我不知道如何将其翻译成Laravel,但为了不将多项选择题的所有答案都计算为单独的正确答案,您需要将它们组合在一个子查询中。
SELECT qa.*, SUM(qa.correct = 1) AS correct, COUNT(*) AS total_answered
FROM (
SELECT qa.*, MIN(qa_is_correct_answer) AS correct
FROM quiz_answers AS qa
GROUP BY qa_quiz_id, qa_question_id
) AS qa
GROUP BY qa.qa_quiz_id
顺便说一下,使用1
表示正确而2
表示错误是非常奇怪的。对于二元期权,我们通常使用0
和1
,其中1
为真值。