2013-02-08 90 views
0

我有一个查询下面的动态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) 

看你的代码,似乎没有成为一个需要加入学生表作为ID在他们的答案已经存在。虽然我确信在某些时候您会将姓名与ID关联起来。