Разработка приложения с PHP и MySQL, которое помогает учителям принимать онлайн-тесты с несколькими вариантами выбора. Каждый экзамен имеет 100 вопросов, и каждый вопрос имеет более 4 вариантов.Как обрабатывать сложные процессы, такие как вычисление среднего балла в mysql?
Когда более 1000 пользователей участвуют в экзамене, когда системный администратор переходит к «Статистикам», чтобы узнать, что такое средний балл или другая статистика, после многих мыслей система ничего не показывает: никакого результата нет статистика.
Расчет: 100 вопросов * 4 варианта * 1000 пользователей, чтобы получить средний балл.
Когда мы запускаем веб-сервер на более мощном ПК, он показывает статистику, но на общем сервере ничего не показывает.
Архитектура стола - InnoDB.
Как рассчитать средний балл и/или экспортировать результаты в файл CSV или добавить их в массив и отсортировать их?
вот код, который рассчитать окончательный счет перед экспортом в CSV файл:
$result_list = array();
foreach($UserTestList as $userTestProp)
{
$result_list[$userTestProp['utid']]=array();
....
$result_list[$userTestProp['utid']]['utid'] = $userTestProp['utid'];
$result_list[$userTestProp['utid']]['utlength'] = gmdate("H:i:s", strtotime($userTestProp['utlast_activity'])-strtotime($userTestProp['utstart_datetime']));
$result_list[$userTestProp['utid']]['utuser_ip'] = $userTestProp['utuser_ip'];
$result_list[$userTestProp['utid']]['utbrowser'] = $userTestProp['utbrowser'];
...
$result_list[$userTestProp['utid']]['correct'] = $test->GetNumOfAnswers('correct',$userTestProp['utid']);
$result_list[$userTestProp['utid']]['incorrect'] = $test->GetNumOfAnswers('incorrect',$userTestProp['utid']);
$result_list[$userTestProp['utid']]['none'] = $test->GetNumOfAnswers('none',$userTestProp['utid']);
$result_list[$userTestProp['utid']]['final_score'] = ($testInfo['tminus_mark']==1?round(($result_list[$userTestProp['utid']]['correct']-($result_list[$userTestProp['utid']]['incorrect']/3)),2):$result_list[$userTestProp['utid']]['correct']);
}
и здесь метод GetNumOfAnswers:
function GetNumOfAnswers($type,$utid)
{
global $table_prefix;
$total_correct_answers=$total_incorrect_answers=$total_none_answered=0;
$QuestionList = $this->GetLessonQuestionListByUTID($utid,NULL);
foreach ($QuestionList as $QuestionInfo)
{
switch ($this->IsCorrect($utid,$QuestionInfo['qid']))
{
case '1':
$total_correct_answers++;
break;
case '0':
$total_incorrect_answers++;
break;
default:
$total_none_answered++;
break;
}
}
switch ($type) {
case 'correct':
return $total_correct_answers;
break;
case 'incorrect':
return $total_incorrect_answers;
break;
case 'none':
return $total_none_answered;
break;
case 'all':
return count($QuestionList);
break;
}
}
и здесь IsCorrect метод:
function IsCorrect($utid,$qid)
{
global $table_prefix;
$query = $this->link->prepare("SELECT `qcid` FROM `".$table_prefix."user_test_question` INNER JOIN `".$table_prefix."user_test_question_choice`
ON `".$table_prefix."user_test_question`.`utqid`=`".$table_prefix."user_test_question_choice`.`utqid` WHERE `utid`=? AND `qid`=?");
$values = array($utid,$qid);
$query->execute($values);
$qcid_chosen = $query->fetchAll();
if(empty($qcid_chosen))
return 2;
$query = $this->link->prepare("SELECT `qcid` FROM `".$table_prefix."questions` INNER JOIN `".$table_prefix."questions_choices`
ON `".$table_prefix."questions`.`qid`=`".$table_prefix."questions_choices`.`qid` WHERE `".$table_prefix."questions`.`qid`=? AND `qcis_answer`=1");
$values = array($qid);
$query->execute($values);
$qcid_correct = $query->fetchAll();
if ($qcid_chosen==$qcid_correct)
return 1;
else
return 0;
return $counts;
}
Это то, для чего предназначены базы данных. Начнем с того, что посмотрим на ваши вопросы, не так ли? – Alex
Сделайте это в своем php-коде, и он сделает это очень быстро. –
Добавьте свой код php и mysql, чтобы мы могли помочь – cmorrissey