如何在MySQL中使用案例获取特定字段的计数

问题描述 投票:0回答:1

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

表::测验问题:

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

mysql laravel count
1个回答
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是真正的价值。

© www.soinside.com 2019 - 2024. All rights reserved.