如何 select 多个 table 数据并按天查看?
How to select data in multiple table and view it in day-wise?
我开发了一个员工午休时间跟踪器,员工必须在午休时间前后打卡 in/out。我以分钟为单位计算了总休息时间并将其保存在数据库中。我向人力资源部门提供了所有休息时间的报告。这里对我来说具有挑战性的部分是提供一份报告,其中夜班员工第二天午休应该出现在前一天。我所做的是,我为每一天创建了一个 8 个字符的代码,该代码将为每位员工保存。
我需要提供的是一份摘要报告,其中将显示员工,其余列是该月的天数。
我现在有两张桌子。
Table CODE
:
ID | CODE | DATE_CREATED |
1 | 9VIHQIHE | 2019-03-30 |
2 | 6JFGGU9P | 2019-03-31 |
3 | UYVEWVN0 | 2019-04-01 |
Table BREAKTIME
:
ID | EMPLOYEE | CODE | TOTAL_BREAKTIME
1 | JOHN | 9VIHQIHE | 00:59:01
2 | RYAN | 9VIHQIHE | 01:01:20
3 | JOHN | 6JFGGU9P | 01:15:08
4 | RYAN | 6JFGGU9P | 00:58:12
5 | JOHN | UYVEWVN0 | 00:57:32
6 | RYAN | UYVEWVN0 | 01:05:16
现在,我需要一份报告,其中包含每个员工每月总休息时间的摘要。
当我的搜索参数是 2019 年 3 月时,报告应该如下所示。
EMPLOYEE | 01 | 02 | .......... | 30 | 31
JOHN | - | - | .......... | 00:59:01 | 01:15:08
RYAN | - | - | .......... | 01:01:20 | 00:58:12
我没有写任何代码,因为我不知道从哪里开始。
拜托,我需要你的帮助。
你可以用一个 JOIN
:
SELECT
DATE_FORMAT(c.date_created, '%d') AS date,
b.employee,
b.total_breaktime
FROM
code c
JOIN breaktime b ON b.code = c.code
WHERE
DATE_FORMAT(date_created, '%Y-%m') = '2019-03'
ORDER BY employee , date_created;
会给你一个像
这样的数据集
30 JOHN 00:59:01
31 JOHN 01:15:08
30 RYAN 01:01:20
31 RYAN 00:58:12
然后您可以首先循环遍历此数据并将其重组为二维数组,其中 employee
作为键,因此每个 "employee" 都可以在最终输出中成为其自己的行:
while($b = $result->fetch_assoc()){
$employee = $b["employee"];
$date = $b["date"];
$time = $b["total_breaktime"];
$BreakTime[$employee][$date] = $time;
}
结果:
$BreakTime = array(
'JOHN' => array(
'30' => '00:59:01',
'31' => '01:15:08',
),
'RYAN' => array(
'30' => '01:01:20',
'31' => '00:58:12',
);
);
最后你可以遍历该数据以将其输出到页面。
echo "<table><tbody>";
foreach($BreakTime as $key => $val) {
echo "<tr><td>" .$key. "</td>";
for($d=1; $d<=31; $d++) {
echo "<td>";
echo isset($BreakTime[$key][$d]) ? $BreakTime[$key][$d] : '00:00';
echo "</td>";
}
echo "</tr>";
}
echo "</tbody></table>";
我开发了一个员工午休时间跟踪器,员工必须在午休时间前后打卡 in/out。我以分钟为单位计算了总休息时间并将其保存在数据库中。我向人力资源部门提供了所有休息时间的报告。这里对我来说具有挑战性的部分是提供一份报告,其中夜班员工第二天午休应该出现在前一天。我所做的是,我为每一天创建了一个 8 个字符的代码,该代码将为每位员工保存。
我需要提供的是一份摘要报告,其中将显示员工,其余列是该月的天数。
我现在有两张桌子。
Table CODE
:
ID | CODE | DATE_CREATED |
1 | 9VIHQIHE | 2019-03-30 |
2 | 6JFGGU9P | 2019-03-31 |
3 | UYVEWVN0 | 2019-04-01 |
Table BREAKTIME
:
ID | EMPLOYEE | CODE | TOTAL_BREAKTIME
1 | JOHN | 9VIHQIHE | 00:59:01
2 | RYAN | 9VIHQIHE | 01:01:20
3 | JOHN | 6JFGGU9P | 01:15:08
4 | RYAN | 6JFGGU9P | 00:58:12
5 | JOHN | UYVEWVN0 | 00:57:32
6 | RYAN | UYVEWVN0 | 01:05:16
现在,我需要一份报告,其中包含每个员工每月总休息时间的摘要。
当我的搜索参数是 2019 年 3 月时,报告应该如下所示。
EMPLOYEE | 01 | 02 | .......... | 30 | 31
JOHN | - | - | .......... | 00:59:01 | 01:15:08
RYAN | - | - | .......... | 01:01:20 | 00:58:12
我没有写任何代码,因为我不知道从哪里开始。
拜托,我需要你的帮助。
你可以用一个 JOIN
:
SELECT
DATE_FORMAT(c.date_created, '%d') AS date,
b.employee,
b.total_breaktime
FROM
code c
JOIN breaktime b ON b.code = c.code
WHERE
DATE_FORMAT(date_created, '%Y-%m') = '2019-03'
ORDER BY employee , date_created;
会给你一个像
这样的数据集30 JOHN 00:59:01
31 JOHN 01:15:08
30 RYAN 01:01:20
31 RYAN 00:58:12
然后您可以首先循环遍历此数据并将其重组为二维数组,其中 employee
作为键,因此每个 "employee" 都可以在最终输出中成为其自己的行:
while($b = $result->fetch_assoc()){
$employee = $b["employee"];
$date = $b["date"];
$time = $b["total_breaktime"];
$BreakTime[$employee][$date] = $time;
}
结果:
$BreakTime = array(
'JOHN' => array(
'30' => '00:59:01',
'31' => '01:15:08',
),
'RYAN' => array(
'30' => '01:01:20',
'31' => '00:58:12',
);
);
最后你可以遍历该数据以将其输出到页面。
echo "<table><tbody>";
foreach($BreakTime as $key => $val) {
echo "<tr><td>" .$key. "</td>";
for($d=1; $d<=31; $d++) {
echo "<td>";
echo isset($BreakTime[$key][$d]) ? $BreakTime[$key][$d] : '00:00';
echo "</td>";
}
echo "</tr>";
}
echo "</tbody></table>";