2

データベースに3つのテーブルがあります。

  • 学生
  • コース
  • 出席

最初の2つのテーブルには2つのフィールド(id、name)があり、3番目のテーブルには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

編集

学生が 1 日に複数のコースに参加できるかどうかについてあなたは言わなかったので、できると思います。

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 に答える