2012-08-13 134 views
2

我有我的數據庫3個表:PHP MySQL的動態表(考勤表)

  • 學生
  • 課程
  • 出席

第2個表有2個字段(ID,名稱),第三個有:corseID,studID,attDate和attStatus,其中attStatus可以存在或不存在

我需要的是t他:動態表具有以下屬性:

  • 第一列標題應爲「姓名」,從學生的表(完成)
  • 第一行應該從日期被填入學生姓名填入在簽到表attDate場(完成)
  • 細胞在上述列和行之間的其餘部分應在考勤表給學生姓名和起止日期
從attStatus場拉考勤狀態

請提供瞭解如何解決這個問題(越詳細,越好)。

回答

1

您可以使用下面的SQL查詢來獲取ALL記錄:

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){}}來繪製每一行。

+0

這確實給了我想要的結果,但是我的問題是我如何讓它們顯示在 – redamakarem 2012-08-14 15:28:54

+0

@redamakarem之前概述現在如何? – Passerby 2012-08-15 07:13:57