如何 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>";