我有日历表,其中包含2021年12月的所有日期(我将仅举例说明表中的一些日期,但可以理解,它实际上包含所述月份的所有日期):
| 识别码|日期|
| - -|- -|
| 01年|2021年12月1日|
| 二|2021年12月2日|
| 03年|2021年12月3日|
| 04年|2021年12月4日|
| 05年|2021年12月5日|
我有用户表:
| 识别码|姓名|雇员人数|
| - -|- -|- -|
| 01年|安德鲁|一百零一|
| 二|玛丽|一百零二|
我有餐桌助手
| 识别码|日期|雇员人数|
| - -|- -|- -|
| 01年|2021年12月3日|一百零一|
| 二|2021年12月4日|一百零一|
| 03年|2021年12月3日|一百零二|
| 04年|2021年12月4日|一百零二|
| 05年|2021年12月5日|一百零一|
| 06年|2021年12月6日|一百零二|
我有一个查询,显示员工编号、姓名、出勤天数和缺勤天数:
SELECT u.num_employee,
u.name,
a.date AS attendances,
(SELECT GROUP_CONCAT(DISTINCT EXTRACT(DAY FROM date)) AS date FROM calendar
WHERE date BETWEEN '2021-12-01' AND '2021-12-31'
AND NOT FIND_IN_SET(EXTRACT(DAY FROM date),a.date)) as faults FROM users u
JOIN (SELECT num_employee,
GROUP_CONCAT(DISTINCT EXTRACT(DAY FROM date)) AS date FROM attendances
WHERE date BETWEEN '2021-12-01' AND '2021-12-31'
GROUP BY num_employee) a ON a.num_employee = u.num_employee
通过上面的查询,我得到了以下结果:
| 雇员人数|姓名|出席人数|断层|
| - -|- -|- -|- -|
| 一百零一|安德鲁|三、四、五|一、二、三、六、七、八、九、十......|
| 一百零二|玛丽|三、四、六|一、二、五、七、八、九、十......|
现在,重点是除了attendances表之外,我还必须考虑另一个表vacations。该表的结构如下:
| 标识符|姓名首字母缩写_日期|最终日期|雇员人数|
| - -|- -|- -|- -|
| 01年|2021年12月7日|2021年12月9日|一百零一|
| 二|2021年12月7日|2021年12月9日|一百零二|
考虑到该表,在该范围内被处理为假期的天数应不再出现在“故障”列中。结果应如下:
| 雇员人数|姓名|出席人数|断层|
| - -|- -|- -|- -|
| 一百零一|安德鲁|三、四、五|一、二、三、六、十......|
| 一百零二|玛丽|三、四、六|一、二、五、十......|
我如何调整我的查询以获得上述结果?
由于我使用的是MariaDB版本,查询无法使用CTE。我正在使用phpMyAdmin。
1条答案
按热度按时间mm9b1k5b1#
由于MySQL和MariaDB不适合序列,所以有一个日历表可以运行是件好事。
因此,需要另一个检索假期日期的子查询。
我在subselect中使用了
GROUP BY
,因为一个月内可能会有不止一个假期。第一个
FIND_IN_SET需要一个字符串,并且不适用于
NULL
,因此需要检查NULL值并替换它们第一个