【问题标题】:Codeigniter: Generating student result sheet from three tablesCodeigniter:从三个表生成学生成绩表
【发布时间】:2026-02-02 22:15:02
【问题描述】:

我的数据库中有以下表格。 midtermfinalterm 表包含学生的分数。

现在我想在单页中显示所有学生的成绩单,如下所示:

我知道如何在单个表中查询,但在这种情况下我遇到了问题,因为有三个表。

我正在使用 Codeigniter,请您帮我在我的模型和视图文件中编码什么?

提前致谢:)

这是我的控制器:

         $this->load->model('Mod_student');
     $data['records1']= $this->Mod_student->check1();
         $this->load->view('view_student',$data);

更新部分

这是我的看法:

    <?php if(count($records1) > 0) { ?>

      <?php foreach ($records1 as $row){ ?>



   <table>
   <tr> <td><?php echo $row['StudentName']; ?></td></tr>

     <tr>

      <td><?php $midDate   =   explode(',',$row['MidDate']);
     foreach($midDate as $md)
         {
         echo $md;
         echo '<br />'  ;
         }
    ?>
         </td> 

       <td><?php $midDate   =   explode(',',$row['MidSubject']);
     foreach($midDate as $md)
         {
         echo $md;
         echo '<br />'  ;
         }
    ?>
      </td> 

       <td><?php $midDate   =   explode(',',$row['MidMarks']);
     foreach($midDate as $md)
         {
         echo $md;
         echo '<br />'  ;
         }
    ?>
       </td> 



       </tr>





     </table>




<?php  } ?>

<?php } else { echo "No Record Found";} ?>

我已经更改了我的视图文件,现在它工作正常 :) 但是我面临一些问题。如果我运行上面的脚本,我会得到以下输出

如果您注意到我的表midterm,您会看到id 为3 的学生的英语和数学成绩相同。但在我的输出中,它只在中间显示一个主题的标记。这是因为您在查询中使用了distinct 吗?我试过删除不同的,但它没有显示确切的数据。

请告诉我如何解决这个问题?

再次感谢您的帮助。:)

【问题讨论】:

    标签: mysql codeigniter codeigniter-2


    【解决方案1】:

    我已经为您找到了解决方案。它将为每个学生获取一条记录,包含他的所有信息。我这里用过mysql的GROUP_CONCAT。因此,在 php 端,您将不得不分解该值,然后在循环中访问它。顺便说一下,你可以这样运行查询。

     $query= "select
              s.id   as SID,
              s.name as StudentName,
              (select group_concat(distinct midterm.date) from midterm where midterm.student_id = SID) as MidDate,
              (select group_concat(distinct midterm.Subject) from midterm where midterm.student_id = SID) as MidSubject,
              (select group_concat(midterm.marks) from midterm where midterm.student_id = SID) as MidMarks,
              (select group_concat(distinct finalterm.date) from finalterm where finalterm.student_id = SID) as FinalDate,
              (select group_concat(distinct finalterm.marks) from finalterm where finalterm.student_id = SID) as FinalMarks,
              (select distinct sum(midterm.marks) from midterm where midterm.student_id = SID) as MidTotal,
              (select distinct sum(finalterm.marks) from finalterm where finalterm.student_id = SID) as FinalTotal
              from students as s
              left join midterm as m on m.student_id = s.id 
              left join finalterm as f on f.student_id = s.id
              and f.subject = m.subject
              group by s.name;";
    
        $query  =   $this->db->query($query);
    

    或 Active Record 版本

    $data   =   array(
                        's.id   as SID',
                        's.name as StudentName',
                        '(select group_concat(distinct midterm.date) from midterm where midterm.student_id = SID) as MidDate',
                        '(select group_concat(distinct midterm.Subject) from midterm where midterm.student_id = SID) as MidSubject',
                        '(select group_concat(midterm.marks) from midterm where midterm.student_id = SID) as MidMarks',
                        '(select group_concat(distinct finalterm.date) from finalterm where finalterm.student_id = SID) as FinalDate',
                        '(select group_concat(distinct finalterm.marks) from finalterm where finalterm.student_id = SID) as FinalMarks',
                        '(select distinct sum(midterm.marks) from midterm where midterm.student_id = SID) as MidTotal',
                        '(select distinct sum(finalterm.marks)from finalterm where finalterm.student_id = SID) as FinalTotal'               
                        );
        $this->db->select($data);
        $this->db->group_by('s.name');
        $this->db->group_by('s.name');
        $this->db->from('students as s');
        $this->db->join('midterm as m','m.student_id = s.id','left');
        $this->db->join('finalterm as f','f.student_id = s.id','left');
        $this->db->group_by('s.name');
    

    使用不同的关键字。这里有一些使用说明。 1.每组concat都要炸开在php端使用。像这样

    <?php echo $row['StudentName']?>
    

    And Group Concat Item 表单查询

     $midDate   =   explode(',',$row['MidDate']);
     foreach($midDate as $md)
     {
     echo $md;
     echo '<br />'  ;
     }
    

    【讨论】:

    • 再次感谢您的帮助。我已经尝试过您的脚本,但无法使其正常工作,可能是我的视图文件中的脚本存在一些问题。请您看一下我上面帖子的编辑部分。我已经发布了我的控制器脚本和查看文件。再次感谢。:)
    • 非常感谢,你刚刚教会了我一个新东西(group_concat),我之前对此一无所知。:) 我正在尝试用谷歌搜索更多信息和示例。非常感谢。:)
    • 如果有任何与 codeigniter activerecord 相关的问题,请查看我的编辑,如果您认为我值得,请告诉我我喜欢解决并投票给我
    • 谢谢伙计,它现在工作得非常完美,除了一些问题。上面的问题我已经在我的帖子中提到过,请您看一下好吗?当然,您应该投票,我已经这样做了,我会将您的答案标记为我接受的答案。谢谢你,你真的很有帮助。实际上,我正在尝试创建一个会计系统,并且目前坚持使用日记帐的总帐。这就是为什么我发布这个问题以了解如何做到这一点。 :)
    • 非常感谢。它现在运行良好。你是天才,毫无疑问:)我还有一件事要问,这与这篇文章无关,但如果可能的话,请回复..你知道任何书籍或网站可以指导我完成 mysql 查询从期刊创建通用分类帐(我说的是财务会计)?我真的很挣扎。谢谢:)