MS MySQL + 根据测验答案与正确答案获取统计数据(百分比)

MS MySQL + get stats (as percentage) based of quiz answers vs correct answer

此尝试有点超出我的 SQL/query 技能,因此我正在寻求有关如何完成它的建议。

总结:

有一个 table 记录用户尝试回答一些测验问题的尝试。

这是 table 布局:

create table quiz_answers(
    id int,
    submit_date datetime,
    session_id varchar(255),
    quiz_name varchar(255),
    question_num varchar(255),
    answer varchar(255),
    correct_answer varchar(255),
    user_ip varchar(255)
);

insert into quiz_answers(id, submit_date, session_id, quiz_name, question_num, answer, correct_answer, user_ip) values
(1, '2019-09-03 11:39:07', 'xxxxx', 'q1_xxx_quiz', 'q1_question0', 'answer1', 'correct_answer', 'xx.xx.xx.xxxx'),
(2, '2019-09-03 11:39:07', 'xxxxx', 'q1_xxx_quiz', 'q1_question0', 'answer2', 'correct_answer', 'xx.xx.xx.xxxx'),
(3, '2019-09-03 11:39:07', 'xxxxx', 'q1_xxx_quiz', 'q1_question0', 'correct_answer', 'correct_answer', 'xx.xx.xx.xxxx'),
(4, '2019-09-03 11:39:07', 'xxxxx', 'q1_xxx_quiz', 'q1_question0', 'answer1', 'correct_answer', 'xx.xx.xx.xxxx'),
(5, '2019-09-03 11:39:07', 'xxxxx', 'q1_xxx_quiz', 'q1_question0', 'answer3', 'correct_answer', 'xx.xx.xx.xxxx'),
(6, '2019-09-03 11:39:07', 'xxxxx', 'q1_xxx_quiz', 'q1_question0', 'answer4', 'correct_answer', 'xx.xx.xx.xxxx'),
(7, '2019-09-03 11:39:07', 'xxxxx', 'q1_xxx_quiz', 'q1_question0', 'answer3', 'correct_answer', 'xx.xx.xx.xxxx'),
(8, '2019-09-03 11:39:07', 'xxxxx', 'q1_xxx_quiz', 'q1_question0', 'correct_answer', 'correct_answer', 'xx.xx.xx.xxxx'),
(9, '2019-09-03 11:39:07', 'xxxxx', 'q1_xxx_quiz', 'q1_question0', 'answer0', 'correct_answer', 'xx.xx.xx.xxxx'),
(10, '2019-09-03 11:39:07', 'xxxxx', 'q1_xxx_quiz', 'q1_question1', 'answer1', 'correct_answer', 'xx.xx.xx.xxxx'),
(11, '2019-09-03 11:39:07', 'xxxxx', 'q1_xxx_quiz', 'q1_question1', 'answer1', 'correct_answer', 'xx.xx.xx.xxxx'),
(12, '2019-09-03 11:39:07', 'xxxxx', 'q1_xxx_quiz', 'q1_question1', 'answer3', 'correct_answer', 'xx.xx.xx.xxxx'),
(13, '2019-09-03 11:39:07', 'xxxxx', 'q1_xxx_quiz', 'q1_question1', 'answer4', 'correct_answer', 'xx.xx.xx.xxxx'),
(14, '2019-09-03 11:39:07', 'xxxxx', 'q1_xxx_quiz', 'q1_question1', 'answer2', 'correct_answer', 'xx.xx.xx.xxxx'),
(15, '2019-09-03 11:39:07', 'xxxxx', 'q1_xxx_quiz', 'q1_question1', 'answer2', 'correct_answer', 'xx.xx.xx.xxxx'),
(16, '2019-09-03 11:39:07', 'xxxxx', 'q1_xxx_quiz', 'q1_question1', 'correct_answer', 'correct_answer', 'xx.xx.xx.xxxx'),
(17, '2019-09-03 11:39:07', 'xxxxx', 'q1_xxx_quiz', 'q1_question0', 'correct_answer', 'correct_answer', 'xx.xx.xx.xxxx');

select * from quiz_answers;
|    | id | submit_date         | session_id | quiz_name   | question_num | answer         | correct_answer | user_ip       |
|----|----|---------------------|------------|-------------|--------------|----------------|----------------|---------------|
| 1  | 1  | 03.09.2019 11:39:07 | xxxxx      | q1_xxx_quiz | q1_question0 | answer1        | correct_answer | xx.xx.xx.xxxx |
| 2  | 2  | 03.09.2019 11:39:07 | xxxxx      | q1_xxx_quiz | q1_question0 | answer2        | correct_answer | xx.xx.xx.xxxx |
| 3  | 3  | 03.09.2019 11:39:07 | xxxxx      | q1_xxx_quiz | q1_question0 | correct_answer | correct_answer | xx.xx.xx.xxxx |
| 4  | 4  | 03.09.2019 11:39:07 | xxxxx      | q1_xxx_quiz | q1_question0 | answer1        | correct_answer | xx.xx.xx.xxxx |
| 5  | 5  | 03.09.2019 11:39:07 | xxxxx      | q1_xxx_quiz | q1_question0 | answer3        | correct_answer | xx.xx.xx.xxxx |
| 6  | 6  | 03.09.2019 11:39:07 | xxxxx      | q1_xxx_quiz | q1_question0 | answer4        | correct_answer | xx.xx.xx.xxxx |
| 7  | 7  | 03.09.2019 11:39:07 | xxxxx      | q1_xxx_quiz | q1_question0 | answer3        | correct_answer | xx.xx.xx.xxxx |
| 8  | 8  | 03.09.2019 11:39:07 | xxxxx      | q1_xxx_quiz | q1_question0 | correct_answer | correct_answer | xx.xx.xx.xxxx |
| 9  | 9  | 03.09.2019 11:39:07 | xxxxx      | q1_xxx_quiz | q1_question0 | answer0        | correct_answer | xx.xx.xx.xxxx |
| 10 | 10 | 03.09.2019 11:39:07 | xxxxx      | q1_xxx_quiz | q1_question1 | answer1        | correct_answer | xx.xx.xx.xxxx |
| 11 | 11 | 03.09.2019 11:39:07 | xxxxx      | q1_xxx_quiz | q1_question1 | answer1        | correct_answer | xx.xx.xx.xxxx |
| 12 | 12 | 03.09.2019 11:39:07 | xxxxx      | q1_xxx_quiz | q1_question1 | answer3        | correct_answer | xx.xx.xx.xxxx |
| 13 | 13 | 03.09.2019 11:39:07 | xxxxx      | q1_xxx_quiz | q1_question1 | answer4        | correct_answer | xx.xx.xx.xxxx |
| 14 | 14 | 03.09.2019 11:39:07 | xxxxx      | q1_xxx_quiz | q1_question1 | answer2        | correct_answer | xx.xx.xx.xxxx |
| 15 | 15 | 03.09.2019 11:39:07 | xxxxx      | q1_xxx_quiz | q1_question1 | answer2        | correct_answer | xx.xx.xx.xxxx |
| 16 | 16 | 03.09.2019 11:39:07 | xxxxx      | q1_xxx_quiz | q1_question1 | correct_answer | correct_answer | xx.xx.xx.xxxx |
| 17 | 17 | 03.09.2019 11:39:07 | xxxxx      | q1_xxx_quiz | q1_question0 | correct_answer | correct_answer | xx.xx.xx.xxxx |

View on RexTester

我正在使用 PHP。我为用户 select 提供了可能的问题答案(在数组或分隔字符串中,可能用于查询的 IN() 部分?)

所以问题:q1_question0

有很多'submissions'

可能的答案:answer1answer2answer3answer4 & correct answer

设置为每次 'attempt' 回答问题时始终保存正确答案(认为以后通过这种方式获取统计信息可能更容易?)..

我正在寻找一种方法来获得 count/max 或更好的每个答案与正确答案的百分比。

即:类似于-

甚至:

我更喜欢我认为的 %.. 所以我可以使用某种 CSS/markup 来直观地创建进度条或其他东西..

此示例仅适用于 1 个问题...有 'x' 个可能答案..但每个问题的可能答案数量不同。 (因此,为什么我认为在 array/delimited 字符串中有可能的答案.. 用于动态查询创建).. <- 但不要让我在这里缺乏经验以任何方式定下基调!哈哈

我不确定这是否也涉及多个子集查询? (要获得每个可能答案的 'stats'?)或者从哪里开始这个答案?

我是否尝试收集具有相同问题名称的所有条目..然后以某种方式尝试通过 IN() 子句中的特定答案将其分解并按问题名称从记录总数中获取百分比?

编辑:

如何获得提交答案与正确答案的百分比?甚至还提供了一个有效的 table 示例,带有数据。

根据提交的答案与正确答案(针对每个可能的可用答案)获取百分比统计数据

因为所有的志愿仇恨者(版主)都喜欢无缘无故地投反对票(除了为了自负)....

这是我最终使用的。

然后我用了一些 PHP 来计算事情:

$statChecker_sql = "SELECT COUNT(*) as total,
(SELECT COUNT(*) FROM image_quiz WHERE answer = 'xx1')as answer1,
(SELECT COUNT(*) FROM image_quiz WHERE answer = 'xx2') as answer2,
(SELECT COUNT(*) FROM image_quiz WHERE answer = 'xx3') as answer3,
(SELECT COUNT(*) FROM image_quiz WHERE answer = 'xx4') as answer4,
(SELECT COUNT(*) FROM image_quiz WHERE answer = 'xx5') as answer5
 FROM image_quiz;";

下面是一个使用 PDO 的动态示例:

$statChecker_sql = "SELECT COUNT(*) as TOTAL, ";
for($i=0; $i<$totalPossibleAnswers; $i++){
    if($i != ($totalPossibleAnswers - 1)){      
        $statChecker_sql .= "(SELECT COUNT(*) FROM image_quiz WHERE answer = :answerValue$i) as answer$i, ";
    }else{
        $statChecker_sql .= "(SELECT COUNT(*) FROM image_quiz WHERE answer = :answerValue$i) as answer$i "; //remove trailing comma (Im sure there is a better way)..lol!!!!!
    }   
}
$statChecker_sql .= " FROM image_quiz WHERE question_num = :targetQuestion";
$statChecker_stmt = $conn->prepare($statChecker_sql);

//dynamically add the potential values for parameterized query
for($i=0; $i<$totalPossibleAnswers; $i++){
    $statChecker_stmt->bindValue(':answerValue'.$i, $quiz['question'][0]['answer'][$i]);}
$statChecker_stmt->bindValue(':targetQuestion',$targetQuestion);

$statChecker_stmt->execute();
$statChecker_stmt->setFetchMode(PDO::FETCH_ASSOC);
$statResults = $statChecker_stmt->fetch(); 
$statResultsCount = count($statResults); //current query index count

// submitted answer count * 100 \ total answers count
//output
echo '<br><br>Total Submitted Answers 1: ' . $statResults['TOTAL'] . '<br>';
echo 'Total Submitted Answers 2: ' . $statResultsCount . '<br>';
echo 'Detailed Answers breakdown: <br>';
for($z=1; $z<$statResultsCount; $z++){
    echo $z . ' - ' . $possibleAnswerArray[$z-1] . ': ' . $statResults['answer'.($z-1)] . ' / ' . $statResults['TOTAL'] . ' (' . round(($statResults['answer'.($z-1)] * 100) / $statResults['TOTAL']) . '%)' . '<br>';
}