用PHP和mySQL创建考勤表结果
我想创建一个HTML考勤表 我有两个SQL表:一个是人员列表和数据,另一个是日期 带有客户端的表“clients”如下所示:用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
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天这样做,那么很难减小查询的大小并保持可读性。