如何使用MySQL

时间:2017-12-23 08:02:17

标签: mysql laravel count

我试图根据某些条件来计算某个字段。但我还没有达到预期的效果。

表格::测验问题:

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

SQL小提琴: http://sqlfiddle.com/#!9/ba1650/3

1 个答案:

答案 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

DEMO

顺便说一下,使用1表示正确而2表示错误是非常奇怪的。对于二元期权,我们通常使用01,其中1为真值。