2

我的数据库中有 3 个表:

  • 学生
  • 培训班
  • 出席

前 2 个表有 2 个字段(id、name),第三个有:corseID、studID、attDate 和 attStatus,其中 attStatus 存在或不存在

我需要的是:具有以下属性的动态表:

  • 第一列的标题应为“姓名”,其中填充了学生表中的学生姓名(完成)
  • 第一行应填充出勤表中 attDate 字段中的日期(完成)
  • 上述列和行之间的其余单元格应从出勤表中的 attStatus 字段中提取出勤状态,给出学生姓名和出勤日期

请提供如何解决此问题的演练(越详细越好)。

4

1 回答 1

1

您可以使用以下 SQL 查询来获取所有记录:

SELECT
s.id Student_ID,
s.name Student_Name,
c.name Course_Name,
a.attStatus Attendance_Status,
a.attDate Attendance_Date
FROM students s
INNER JOIN attendance a ON (s.id=a.studID)
INNER JOIN courses c ON (a.courseID=c.id)
ORDER BY a.attDate ASC

编辑

您没有说学生是否可以每天参加多门课程,所以我认为可以。

在 PHP 方面,执行以下操作:

$dates=array();
$students=array();
while($row=mysqli_fetch_assoc($result))
{
 if(!in_array($dates[$row["Attendance_Date"]])) $dates[]=$row["Attendance_Date"];
 if(empty($students[$row["Student_ID"]]))
   $students[$row["Student_ID"]]=array("name"=>$row["Student_Name"]);
 if(empty($students[$row["Student_ID"]][$row["Attendance_Date"]])
   $students[$row["Student_ID"]][$row["Attendance_Date"]]=array();
 $students[$row["Student_ID"]][$row["Attendance_Date"]][$row["Course_Name"]]=$row["Attendance_Status"];
}

所以当循环结束时,你可以得到这样的$students数组:

Array(2) =>
{
  123 =>
   {
     "name"=>"Einstein",
     "2012-08-01"=>
      {
        "Math"=>"present",
        "Phys"=>"absent"
      }
     "2012-08-02"=>
      {
        "Liter"=>"absent",
        "Music"=>"present"
      }
   }
  456 =>
   {
     "name"=>"Heisenberg",
     "2012-08-01"=>
      {
        "Math"=>"absent",
        "Phys"=>"present"
      }
   }
}

并且所有日期都在$dates数组中。然后你可以foreach$dates数组中画出第一行,然后再foreach($students){foreach($dates){}}画出每一行。

于 2012-08-14T05:23:52.770 回答