稍稍偏离我的舒适区,我希望有人可以解释实现我需要的最佳方式。
这是一个非常简单的员工出勤系统。
员工表包括员工的姓名。
出勤表包括当天工作班次的日期和类型(全日/半日/半日)。
我现在想要做的是创建一个报告作为一个表格,显示所有员工在两个日期(支付期)之间的出勤率。
我认为第一列应该是员工姓名,然后后续列将以两个日期之间的每个日期(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
不太确定日期数组是否填充不正确: - /
答案 0 :(得分:2)
一段代码来说明我的comment:
$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 'name';
foreach($dates as $d){
echo $d;
}
//data
foreach($users as $u) {
//echo $u['first_name'];
foreach($dates as $d) {
if (isset($u['attendance'][$d])) {
echo $u['attendance'][$d];
} else {
// for missing records?
}
}
//end row
}
答案 1 :(得分:1)
这是我用于输出SQL结果的基本输出循环。它可以通过基于$key
值的条件格式或者你有什么来扩展。
您还应该对printf()
和sprintf()
函数表示友好,因为它们非常实用。
$rs; // assuming this is an indexed array of rows returned from your DB
// ie: $rs[0]['id']
$output = '<table>';
//print header row by iterating through the first result row and printing the keys
$output .= '<tr>';
foreach($rs[0] as $key => $value) {
$output .= sprintf('<td>%s</td>', $key);
}
$output .= '</tr>';
//now the data rows
foreach($rs as $row) {
$output .= '<tr>';
foreach($row as $key => $value) {
$output .= sprintf('<td>%s</td>', $value);
}
$output .= '</tr>';
}
$output .= '</table>';
echo $output;
答案 2 :(得分:1)
简言之:
首先查询日期以创建表头。
接下来使用您的查询来获取数据以在html表中创建所有行。
而且你必须记住前一个结果行中的first_name
。如果更改first_name
,则在html表中开始新行。
伪代码(未完成):
$results = query("SELECT ... only dates");
// ... some html ... opening header row
foreach($results as $date) {
echo "<td>", $date, "</td>";
}
$results = query("SELECT ... your query");
$last__first_name = "";
// ... some html ... closing header row and opening data rows
foreach($results as $row) {
if( $row->first_name != $last__first_name ) {
$last__first_name = $row->first_name;
echo "</tr><tr>"; // create new row in html table
echo "<td>", $row->first_name, "</td>";
}
echo "<td>", $row->att, "</td>"; // next column
}
// ... some html ... closing table
答案 3 :(得分:-1)
您可以在HTML表格中回显结果。首先,您创建标题:
echo '<table>';
echo '<tr><td>Column 1</td><td>Column 2</td><td>Column 3</td>......</tr>';
然后,执行SQL查询(SELECT):
$result = mysql_query("SELECT * FROM table ... ...");
在此之后,您可以使用“while”迭代结果:
while ($row = mysql_fetch_array($result ) ) {
echo '<tr><td>'.$row['name_of_column_1_in_db'].'</td><td>'.$row['name_of_column_2_in_db'].'</td> .......... </tr>';
}
然后,关闭表格标签:
echo '</table>';