我的数据库中有3个表:
学生
课程
出席
前两个表有两个字段(id、name),第三个表有:corseID、studID、attDate和attStatus,其中attStatus存在或不存在
我需要的是:一个具有以下属性的动态表:
第一列的标题应该是“Name”,用student表中的student Name填充(done)
第一行应该填入考勤表中attDate字段中的日期(done)
上述列和行之间的其他单元格应具有从考勤表的attStatus字段中提取的考勤状态,该字段提供学生姓名和考勤日期
请简要介绍如何解决这个问题(越详细越好)。

最佳答案

可以使用以下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){}}绘制每一行。

10-06 11:31