私のコンフォートゾーンから少し外れて、私が必要とするものを達成するための最良の方法を誰かが説明してくれることを願っています.
非常にシンプルなスタッフ出勤制度です。
スタッフ テーブルには、スタッフ メンバーの名前が含まれます。
出席テーブルには、その日に働いた日付とシフトの種類 (フル/ハーフ/1 日半) が含まれます。
ここでやりたいことは、2 つの日付 (支払い期間) 間のすべてのスタッフの出席を示すテーブルとしてレポートを作成することです。
最初の列はスタッフ名である必要があり、その後の列は 2 つの日付 (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
日付配列が正しく入力されていないかどうかはよくわかりません:-/