2013-02-08 2 views
0

У меня есть запрос ниже с предложением dynamic where, где он выводит результаты в зависимости от выбранного меню. Теперь предложение where работает правильно при добавлении и удалении определенных условий в зависимости от выбранных опций.Правильно ли он не отвечает за ответы?

Но я понял, что если я хочу посмотреть на все вопросы, у меня нет условия QuestionId = ?, но это нормально, но когда нужно отображать ответы на каждый вопрос, вместо отображения это нравится:

D (this is for question 1) 
B,C,E (this is for question 2) 

он отображает их все как один ответ, как показано ниже, который является неправильным:

D,B,C,E 

Мой вопрос: что является причиной этого, запрос или цикл?

var_dump ($ вопросов): выводит на экран это:

array(1) { [39]=> array(1) { [72]=> array(1) { ["answer"]=> string(7) "B,C,D,E" } } }

72 является QuestionID, так что для какой-то странной причине не происходит по всем вопросам (там должен быть второй вопрос, который 73)

Ниже код:

$selectedstudentanswerqry = " 
      SELECT sa.StudentId, q.QuestionId, 
      GROUP_CONCAT(DISTINCT Answer ORDER BY Answer SEPARATOR ',') AS Answer 
      FROM Student st 
      INNER JOIN Student_Answer sa ON (st.StudentId = sa.StudentId) 
      INNER JOIN Question q ON (sa.QuestionId = q.QuestionId) 
      INNER JOIN Answer an ON q.QuestionId = an.QuestionId 
      "; 

      // Initially empty 
      $where = array('q.SessionId = ?'); 
      $parameters = array($_POST["session"]); 
      $parameterTypes = 'i'; 


      //check if POST is empty 

      // Check whether a specific student was selected 
      $p_student = empty($_POST["student"])?'':$_POST["student"]; 

      switch($p_student){ 
      case 0: 
       //dont' add where filters 
       break; 
      default: 
       $where[] = 'sa.StudentId = ?'; 
       $parameters[] .= $_POST["student"]; 
       $parameterTypes .= 'i'; 
      } 

      // Check whether a specific question was selected 
      $p_question = empty($_POST["question"])?'':$_POST["question"]; 

      switch($p_question){ 
      case 0: 
       //dont' add where filters 
       break; 
      default: 
       $where[] = 'q.QuestionId = ?'; 
       $parameters[] .= $_POST["question"]; 
       $parameterTypes .= 'i'; 
      } 

      // If we added to $where in any of the conditionals, we need a WHERE clause in 
      // our query 
      if(!empty($where)) { 
       $selectedstudentanswerqry .= ' WHERE ' . implode(' AND ', $where); 
       global $mysqli; 
       $selectedstudentanswerstmt=$mysqli->prepare($selectedstudentanswerqry); 
       // You only need to call bind_param once 

       if (count($where) == 1) { 
       $selectedstudentanswerstmt->bind_param($parameterTypes, $parameters[0]); 
      } 
      else if (count($where) == 2) { 
       $selectedstudentanswerstmt->bind_param($parameterTypes, $parameters[0], $parameters[1]); 
      } 
      else if (count($where) == 3) { 
       $selectedstudentanswerstmt->bind_param($parameterTypes, $parameters[0], $parameters[1], $parameters[2]); 
      } 

      } 

      $selectedstudentanswerqry .= " 
       GROUP BY sa.StudentId, q.QuestionId 
       ORDER BY StudentAlias, q.SessionId 
      "; 

     // get result and assign variables (prefix with db) 
     $selectedstudentanswerstmt->execute(); 
     $selectedstudentanswerstmt->bind_result($detailsStudentId,$detailsQuestionId,$detailsAnswer); 

     $selectedstudentanswerstmt->store_result(); 
     $selectedstudentanswernum = $selectedstudentanswerstmt->num_rows(); 

    $questions = array(); 

    while ($selectedstudentanswerstmt->fetch()) { 

     $questions[$detailsStudentId][$detailsQuestionId] = array(

     'answer'=>$detailsAnswer, 

); 

} 

... 

<?php 

var_dump($questions); 

     foreach ($questions as $studentId => $student) 
{ 

foreach ($student as $questionId => $question) { 

echo '<p><strong>Answer:</strong> ' .htmlspecialchars($question['answer']). '</p>' . PHP_EOL; 

} 

} 

?> 
+0

Я не вижу ничего, что могло бы повлиять на ваш результат, за исключением этой строки 'GROUP BY sa.StudentId, q.QuestionId' попытаться удалить его и увидеть результаты, которые вы получите – shnisaka

+0

@shnisaka Я буду тестировать это – user1830984

+0

@shnisaka Нет не работает, я опубликую скриншот о том, что отображается в запросе. Фактически, что я буду делать, вставьте результат запроса в качестве образца, а затем спросите, как писать цикл. Вам нравится этот вызов? – user1830984

ответ

0

Похоже, проблема на самом деле:

GROUP_CONCAT(DISTINCT Answer ORDER BY Answer SEPARATOR ',') AS Answer 

часть запроса. Не видя фактической структуры таблицы и данных, очень сложно сформировать мысленный образ того, что происходит. «Ответ» может быть неоднозначным столбцом и, следовательно, вызывать непредсказуемые результаты.

Возможно, вы захотите написать подзапрос или создать представление для этого.

SELECT sa.StudentID, q.QuestionId, sa.Student_Answers 
FROM (
    SELECT GROUP_CONCAT(DISTINCT a.Answer SEPERATOR ',') as Question_Answers 
    FROM Student_Answer a 
    GROUP BY a.QuestionID 
) AS sa 
INNER JOIN Question q ON (sa.QuestionId = q.QuestionId) 

При взгляде на ваш код, кажется, нет необходимости входить в таблицу учеников, поскольку идентификатор уже существует в их ответах. Хотя я уверен, что в какой-то момент вы свяжете имена с идентификаторами.

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