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 |
我正在使用 PHP。我为用户 select 提供了可能的问题答案(在数组或分隔字符串中,可能用于查询的 IN()
部分?)
所以问题:q1_question0
有很多'submissions'
可能的答案:answer1
、answer2
、answer3
、answer4
& correct answer
设置为每次 'attempt' 回答问题时始终保存正确答案(认为以后通过这种方式获取统计信息可能更容易?)..
我正在寻找一种方法来获得 count/max 或更好的每个答案与正确答案的百分比。
即:类似于-
answer1
- 25%
answer2
- 50%
answer3
- 10%
answer4
- 5%
correct answer
- 10%
甚至:
answer1
- 4/10
answer2
- 2/10
answer3
- 1/10
answer4
- 1/10
correct answer
- 2/10
我更喜欢我认为的 %.. 所以我可以使用某种 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>';
}
此尝试有点超出我的 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 |
我正在使用 PHP。我为用户 select 提供了可能的问题答案(在数组或分隔字符串中,可能用于查询的 IN()
部分?)
所以问题:q1_question0
有很多'submissions'
可能的答案:answer1
、answer2
、answer3
、answer4
& correct answer
设置为每次 'attempt' 回答问题时始终保存正确答案(认为以后通过这种方式获取统计信息可能更容易?)..
我正在寻找一种方法来获得 count/max 或更好的每个答案与正确答案的百分比。
即:类似于-
answer1
- 25%answer2
- 50%answer3
- 10%answer4
- 5%correct answer
- 10%
甚至:
answer1
- 4/10answer2
- 2/10answer3
- 1/10answer4
- 1/10correct answer
- 2/10
我更喜欢我认为的 %.. 所以我可以使用某种 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>';
}