如何使用codeIgniter显示来自3个组合表的数据

时间:2011-07-09 12:12:20

标签: php mysql codeigniter

我有三个数据库表, question_set 问题回答
question_set 包含 set_name set_id
问题包含问题以及 question_set_id
回答包含回答 question_id

我无法找到在一个视图文件中显示所有数据的方法,
我尝试了连接,但随后问题数据重复打印,因为每个问题都有三个或四个答案。

2 个答案:

答案 0 :(得分:0)

最简单的方法,但当然需要更多的SQL调用,就是使用嵌套循环。

1)加入问题集和问题表 2)对于结果集中的每个条目,检索该条目的答案并将其放在一个单独的数组中,嵌套在一个更大的数组中,其中键是问题的id。

您的观点将如下所示:

foreach($questions as $question)
{
    //Print question information
    $answers = $answers_array[$question['id']];
    foreach($answers as $answer)
    {
        //Print answers information
    }
}

可能不是最佳做法,但它会起作用。

答案 1 :(得分:0)

我想我会指出。

您的数据库设计非常糟糕。

它不会很好地扩展,事实上我认为它实际上不会。工作

我这样做的方式是

三张桌子

sets => id,名称
questions => id,set_id,问题
answers => id,set_id,question_id,answer,points

请注意,在上面的示例中,我更进一步,而不是每个答案都是真或假,它可以有一个指定的点值。 因此,你认为半正确的答案可以给出5分,其中正确的答案可以给出10分,它也可以作为布尔值真,只有正确答案为1分,错误答案为0分

反正。

考虑到上面的表设计。

你可以做到

$this->db->select('s.id as set, s.name as name, q.id as qid, q.question as qu, a.id as aid, a.answer as an, a.points as p')
         ->from('sets s')
         ->join('questions q', 'q.set_id = s.id')
         ->join('answers a', 's.set_id = s.id')
         ->where('s.id', 'SET ID');

$questions = $this->db->get();
$set = array('questions' => array());

foreach($questions as $s){
  $set['id'] = $s->set;
  $set['name'] = $s->name;
  $set['questions'][$s->qid]['id'] = $q->qid;
  $set['questions'][$s->qid]['question'] = $q->qu;
  if(!isset($set['questions'][$s->qid]['answers']))
    $set['questions'][$s->qid]['answers'] = array();
  $set['questions'][$s->qid]['answers'][] = array(
    'id' => $q->aid,
    'answer' => $q->an',
    'points' => $q->p
  );
}

那么你最终得到一个类似于

的数组
array(
  'id' => 1,
  'name' => 'My first quiz',
  'questions' = array(
    array(
      'id' => 1,
      'question' => 'What is 1+1+1?',
      'answers' => array(
        array(
          'id' => 1,
          'answer' => 1,
          'points' => 0
        ),
        array(
          'id' => 2,
          'answer' => 2,
          'points' => 0
        ),
        array(
          'id' => 3,
          'answer' => 3,
          'points' => 1
        )
      )
    ),
    array(
      'id' => 2,
      'question' => 'What is 2+2+2?',
      'answers' => array(
        array(
          'id' => 4,
          'answer' => 6,
          'points' => 1
        ),
        array(
          'id' => 5,
          'answer' => 2,
          'points' => 0
        ),
        array(
          'id' => 6,
          'answer' => 3,
          'points' => 0
        )
      )
    )
  )
);

然后你可以做。

echo '<h2>'.$set['name'].'</h2>';
foreach($set['questions'] as $q){
  echo '<div class="question">';
  echo '<h3>'.$q['question'].'</h3>';
  echo '<div class="answers">';
  foreach($q['answers'] as $a){
    echo '<label for="a'.$a['id'].'">'.$a['answer'].'<input type="checkbox value="'.$a['id'].'" name="q'.$q['id'].'" /></label><br />';
  }
  echo '</div>';
  echo '</div>';
}