2013-08-06 2 views
0

Разработка приложения с 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; 
    } 
+3

Это то, для чего предназначены базы данных. Начнем с того, что посмотрим на ваши вопросы, не так ли? – Alex

+0

Сделайте это в своем php-коде, и он сделает это очень быстро. –

+1

Добавьте свой код php и mysql, чтобы мы могли помочь – cmorrissey

ответ

0

Несомненно, у вас есть некоторые недостатки дизайна в вашей структуре/приложении. MySQL я достаточно способен вычислять средние значения для огромных наборов данных.

Являются ли ваши структуры данных удобными для удобства чтения?

Ваши таблицы индексируются по столбцам, которые читаются больше всего?

Является ли ваша логика усреднения приложения выполняемой в MySQL как один запрос? или он работает в PHP?

Если он запущен на PHP, то, скорее всего, ваша общедоступная среда хостинга имеет PHP memory_limit, который вы превысите (потому что вы пытаетесь прочитать много данных из MySQL в PHP и его процесс).

Смежные вопросы