出现了这样的一个场景,我有一个聚合查询,我需要多次引用这个聚合查询的结果,但是我发现每次引用都会导致查询速率增加,所以结合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;