聚合查询引用多次导致查询变慢的解决示例

出现了这样的一个场景,我有一个聚合查询,我需要多次引用这个聚合查询的结果,但是我发现每次引用都会导致查询速率增加,所以结合ai引用子查询的方法最终速率控制在了1秒内.

SELECT 
    temp.*,
    temp.dayHoursNew + 10.01 AS dayHours,
    temp.dayHoursNew * 2 AS doubleHours,
    IF(temp.dayHoursNew > 8, 'Full', 'Part') AS workStatus
FROM (
    SELECT 
        t.id, 
        t.user_id AS userId, 
        e.`name` AS userName, 
        p.`name` AS deptName, 
        p.`parent_name` AS parentDeptName, 
        t.check_in_shift_time_day AS `date`, 
        t.check_in_time_day AS inputTime, 
        t.check_out_time_day AS outTime, 
        p.parent_department_id AS parentDepartmentId,
        ROUND(
            AVG(
                CASE
                    WHEN 3600 >= TIMESTAMPDIFF(SECOND, TIME(check_in_shift_time_day), STR_TO_DATE('08:00:00', '%H:%i:%s'))
                        AND TIMESTAMPDIFF(SECOND, TIME(check_in_shift_time_day), STR_TO_DATE('08:00:00', '%H:%i:%s')) >= 0
                        AND (check_in_result NOT IN('NoNeedCheck', 'Lack', 'Todo', 'Invalid', 'SeriousLate', 'Late')
                            AND check_out_result NOT IN('NoNeedCheck', 'Lack', 'Todo', 'Invalid', 'SeriousLate', 'Late')) THEN 
                        TIMESTAMPDIFF(SECOND, STR_TO_DATE(CONCAT(DATE(check_in_shift_time_day), '08:00:00'), '%Y-%m-%d %H:%i:%s'), check_out_time_day) / 3600
                    ELSE TIMESTAMPDIFF(SECOND, check_in_time_day, check_out_time_day) / 3600
                END
            ), 2
        ) AS dayHoursNew
    FROM 
        `t_attendance_check_record` t
        INNER JOIN t_attendance_shift sf ON t.shift_id = sf.shift_id
        INNER JOIN `t_employee` e ON e.user_id = t.user_id
        INNER JOIN `t_dept` p ON e.department_id = p.open_department_id
    WHERE 
        t.check_in_shift_time_day BETWEEN '2025-03-01 00:00:00' AND '2025-03-31 23:59:59'
    GROUP BY 
        t.id, t.user_id, userName, deptName, `date`, `inputTime`, `outTime`, parentDeptName, parentDepartmentId
    LIMIT 10  -- 这里是限制子查询内部的记录数量
) AS temp
ORDER BY 
    temp.`date`, temp.id;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值