Mysql 如何优化此sql查询?
这里有四张桌子 待定标准工作时间 tbl_出席率 tbl_假日酒店 tbl_离开 我想通过此查询查找员工缺勤报告…但我将此应用于许多员工时需要花费很多时间…是否有任何方法可以简化此查询Mysql 如何优化此sql查询?,mysql,sql,Mysql,Sql,这里有四张桌子 待定标准工作时间 tbl_出席率 tbl_假日酒店 tbl_离开 我想通过此查询查找员工缺勤报告…但我将此应用于许多员工时需要花费很多时间…是否有任何方法可以简化此查询 SELECT date FROM tbl_std_working_hour WHERE date NOT IN (SELECT date FROM tbl_attendance WHERE emp_id = '$emp_id') AND date NOT IN (SELECT date FROM tbl_holi
SELECT date
FROM tbl_std_working_hour
WHERE date NOT IN (SELECT date FROM tbl_attendance WHERE emp_id = '$emp_id')
AND date NOT IN (SELECT date FROM tbl_holiday)
AND date NOT IN (SELECT date FROM tbl_leave WHERE emp_id = '$emp_id')
AND total_hour <> '00:00:00'
AND date >= '$start'
AND date <= '$end'
AND emp_id = '$emp_id'
首先,我将使用NOT EXISTS重写: 然后添加以下复合多列索引: tbl_标准工作小时P_id、日期、总小时 tbl_出席者姓名、日期 如果date是主键或唯一键,则tbl_holidaydate可能已经存在 如果emp_id是主键或唯一的,则tbl_leveemp_id可能已经存在
注意,我将子查询更改为在外部查询中引用emp_id。这使得更改emp_id更容易。此外,您的查询应该使用WHERE子句中的值的参数。这也是一种更好的方法,可以更好地使用UNION ALL
tbl_holiday不包含emp_id…。因此它在where子句“更新请检查”中给出了类似1054-未知列“th.emp_id”的错误。@Suraz。实际上,union all并不是更好,因为它可能会阻止在MySQL中的各个表上使用索引。@Kabir。不工作是相当模糊的。您应该更具体地说明问题。请参阅
SELECT wh.date
FROM tbl_std_working_hour wh
WHERE NOT EXISTS (SELECT 1
FROM tbl_attendance a
WHERE a.date = wh.date AND a.emp_id = wh.emp_id
) AND
NOT EXISTS (SELECT 1
FROM tbl_holiday h
WHERE h.date = wh.date
) AND
NOT EXISTS (SELECT 1
FROM tbl_leave l
WHERE l.emp_id = wh.emp_id and l.date = wh.date
)
WHERE wh.total_hour <> '00:00:00' AND
wh.date >= '$start' AND
wh.date <= '$end' AND
wh.emp_id = '$emp_id';
SELECT date
FROM tbl_std_working_hour AS tswh
WHERE NOT EXISTS(
SELECT date FROM tbl_attendance ta WHERE ta.date = tswh.date AND ta.emp_id = tswh.emp_id
UNION ALL
SELECT date FROM tbl_holiday th WHERE th.date = tswh.date
UNION ALL
SELECT date FROM tbl_leave tl WHERE tl.date = tswh.date AND tl.emp_id = tswh.emp_id)
AND total_hour <> '00:00:00'
AND date >= '$start'
AND date <= '$end'
AND emp_id = '$emp_id'