有点超出我的舒适区,我希望有人能解释实现我需要的最佳方法。
这是一个非常简单的员工考勤系统。
职员表包括职员的姓名。
出勤表包括他们当天工作的日期和班次类型(全班/半班/一天半)。
我现在要做的是创建一个表格,显示两个日期(一个支付期)之间所有员工的出勤情况。
我在想第一列应该是员工姓名,然后后面的列将以两个日期(start_date 和 end_date)之间的每个日期作为标题,然后我想用成员的班次填充表格的其余部分工作人员在特定日期工作。
所以,它看起来像这样:
Name | 2013-05-26 | 2013-05-27 | etc
-------------------- ---------------------------
John | full | half |
Mary | off | full |
Peter | half | full |
以下查询为我提供了所有数据:
SELECT a.id, first_name, last_name, attDate, staff_id, att, late
FROM staff as a LEFT OUTER JOIN staff_attendance AS b
ON a.id = b.staff_id
AND b.`attDate` >= '2013-05-26'
AND b.`attDate` <= '2013-06-27'
ORDER BY last_name, attDate;
基本上是:
id | first_name | last_name | attDate | staff_id | att | late
------------------------------------------------------------------------
1 | John | smith | 2013-05-26 | 1 | full | 0
1 | John | smith | 2013-05-27 | 1 | half | 0
2 | Mary | Jones | 2013-05-26 | 2 | off | 0
2 | Mary | Jones | 2013-05-27 | 2 | full | 0
3 | Peter | Doe | 2013-05-26 | 3 | half | 0
3 | Peter | Doe | 2013-05-26 | 3 | full | 0
如您所见,我拥有所有数据,只是不知道如何将其放入表中。
非常欢迎任何想法或建议。
非常感谢
格雷姆
根据 dev-null-dweller 的建议,我有以下代码:
$dbh = new PDO("mysql:host=$hostname;dbname=web14-fresh", $username, $password);
$sql = "SELECT a.id, first_name, last_name, attDate, staff_id, att, late FROM staff as a LEFT OUTER JOIN staff_attendance AS b ON a.id = b.staff_id AND b.`attDate` >= '" . $startdate. "' AND b.`attDate` <= '". $enddate . "' ORDER BY last_name, attDate;";
$stmt = $dbh->query($sql);
$dates = array();
$users = array();
while($row = $stmt->fetch(\PDO::FETCH_ASSOC)) {
$dates[] = $row['attDate'];
if (!isset($users[$row['id']])) {
$users[$row['id']] = array(
'first_name' => $row['first_name'],
'last_name' => $row['last_name'],
'attendance' => array()
);
}
$users[$row['id']]['attendance'][$row['attDate']] = $row['att'];
}
$dates = array_unique($dates);
sort($dates);
// header
echo '<table border=1><tr>';
echo '<td>Name</td>';
foreach($dates as $d){
echo '<td>'.$d.'</td>';
}
echo '</tr>';
//data
foreach($users as $u) {
echo '<tr><td>'.$u['first_name'].'</td>';
foreach($dates as $d) {
if (isset($u['attendance'][$d])) {
echo '<td>'.$u['attendance'][$d].'</td>';
} else {
echo '<td>?</td>';
}
}
//end row
echo '</tr>';
}
echo '</table>';
这似乎并没有填充顶部的所有日期,也看不出原因。这就是我得到的。
Name 2013-06-26
Katy ? full
Lauren ? full
Laura ? full
Louise ? holiday
Jade ? off
不太确定日期数组没有正确填充:-/