Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用PHP和mySQL创建考勤表结果_Php_Sql - Fatal编程技术网

用PHP和mySQL创建考勤表结果

用PHP和mySQL创建考勤表结果,php,sql,Php,Sql,我想创建一个HTML考勤表 我有两个SQL表:一个是人员列表和数据,另一个是日期 带有客户端的表“clients”如下所示: cl_id | cl_name --------------- 1 | john 2 | rob 3 | sam ab_id | ab_cl_id | ab_date | ab_type --------------------------------------- 1 | 1 | 2020-02-01 | A 2

我想创建一个HTML考勤表

我有两个SQL表:一个是人员列表和数据,另一个是日期

带有客户端的表“clients”如下所示:

cl_id | cl_name
---------------
1     | john
2     | rob
3     | sam
ab_id | ab_cl_id | ab_date    | ab_type
---------------------------------------
1     | 1        | 2020-02-01 | A
2     | 2        | 2020-02-01 | P
3     | 1        | 2020-02-02 | P
4     | 2        | 2020-02-02 | P
5     | 3        | 2020-02-02 | P
6     | 2        | 2020-02-03 | A
7     | 3        | 2020-02-03 | A
带有日期的“缺勤”表如下所示:

cl_id | cl_name
---------------
1     | john
2     | rob
3     | sam
ab_id | ab_cl_id | ab_date    | ab_type
---------------------------------------
1     | 1        | 2020-02-01 | A
2     | 2        | 2020-02-01 | P
3     | 1        | 2020-02-02 | P
4     | 2        | 2020-02-02 | P
5     | 3        | 2020-02-02 | P
6     | 2        | 2020-02-03 | A
7     | 3        | 2020-02-03 | A
我想要这个结果(1,2,3是一个月中的天数):

我尝试了以下SQL:

SELECT     cl.cl_id, cl.cl_name, ab.cl_id, ab.ab_date, ab.ab_type
FROM       clients AS cl
INNER JOIN absence AS ab ON cl.cl_id = ab.ab_cl_id
WHERE      YEAR(ab.ab_date) = 2020
AND        MONTH(ab.ab_date) = 2
ORDER BY   cl.cl_name ASC
但结果如下:

name | 1 | 2 | 3 
-----------------
john | A |   |
john |   | P |
rob  | P |   |
rob  |   | P |
rob  |   |   | A
sam  |   | P |
sam  |   |   | A
我怎样才能达到我上面提到的结果


谢谢你的建议

您需要聚合来减少行数。因此:

SELECT cl.cl_id, cl.cl_name,
       MAX(CASE WHEN DAY(ab.ab_date) = 1 THEN ab.ab_type END) as day_01,
       MAX(CASE WHEN DAY(ab.ab_date) = 2 THEN ab.ab_type END) as day_02,
       MAX(CASE WHEN DAY(ab.ab_date) = 3 THEN ab.ab_type END) as day_03
FROM clients cl JOIN
     absence ab
     ON cl.cl_id = ab.ab_cl_id
WHERE YEAR(ab.ab_date) = 2020 AND MONTH(ab.ab_date) = 2
ORDER BY cl.cl_id, cl.cl_name ASC

非常感谢,你的回答帮助了我。我只是有一个“装腔作势的问题”。我想问您是否可以以某种方式减少天数(现在我的SQL有31行,看起来不太好)。谢谢大家!@阿梅泰斯特。如果您在一个月内连续31天这样做,那么很难减小查询的大小并保持可读性。