使用mysql在一次查询中获取员工的月度记录

时间:2018-09-27 03:59:13

标签: php sql

我正在使用此查询来获取存在和不存在的员工的月度记录。 但是,我通过使用此查询获得了一名员工的结果,但是对于所有员工,它似乎都不起作用。

SELECT 
    m.emp_id AS `Empid`,
    d.dt AS `AbsentDate`,
    (CASE
        WHEN p.punch_status IS NULL THEN 'A'
        ELSE p.punch_status
    END) s
FROM
    (SELECT 
        DATE(t.added_date) AS dt
    FROM
        pmc_attendance t
    WHERE
        DATE(t.added_date) >= '2018-08-01'
            AND DATE(t.added_date) < DATE_ADD('2018-08-31', INTERVAL 1 DAY)
    GROUP BY DATE(t.added_date)
    ORDER BY DATE(t.added_date)) d
        CROSS JOIN
    tbl_admin_users m
        LEFT JOIN
    pmc_attendance p ON DATE(p.added_date) >= d.dt
        AND DATE(p.added_date) < d.dt + INTERVAL 1 DAY
        AND p.emp_id = m.emp_id
WHERE
    p.emp_id IS NULL AND m.emp_id = '000838'
GROUP BY d.dt
ORDER BY m.emp_id , d.dt

我正在使用两个表1. tbl_admin_users-存储的员工数据2. pmc_attendance-当前的员工记录。 在查询中是否已通过和m.emp_id ='000838',它可以正常工作,但我想显示所有员工的所有记录。有关如何优化此查询的任何建议。

1 个答案:

答案 0 :(得分:0)

有两种方法可以构造此查询。我可以看到yuo在做什么,而且我认为唯一的问题是您的group by子句。您不需要它们,因为所有内容都应与众不同。您的状态将始终为“ A”,因为您只会得到当天没有员工打孔的行,因此您也可以取出案例说明。

SELECT 
    m.emp_id AS Empid,
    d.dt AS AbsentDate,
    'A' s
FROM 
    (
    SELECT distinct DATE(t.added_date) AS dt 
    FROM pmc_attendance t 
    WHERE t.added_date >= '2018-08-01'  AND DATE(t.added_date) < DATE_ADD('2018-08-31', INTERVAL 1 DAY)
    ) d
CROSS JOIN tbl_admin_users m
LEFT JOIN pmc_attendance p ON p.emp_id = m.emp_id and DATE(p.added_date) >= d.dt AND DATE(p.added_date) < d.dt + INTERVAL 1 DAY
WHERE p.emp_id IS NULL 
ORDER BY m.emp_id , d.dt

如果您要同时包含当前和不存在的内容,则需要重新放入case语句,并删除支票WHERE p.emp_id IS NULL

如果您每天有多个打卡,则需要将其解析为一个带有MIN / MAX的单个条目,这样您每人每天只能获得一行,然后重新添加到您的group by Emp_ID, d.dt < / p>