MySQL子查询替代方案
我有一个包含4个子查询的查询。问题是:MySQL子查询替代方案,mysql,Mysql,我有一个包含4个子查询的查询。问题是: SELECT (SELECT COUNT(id) FROM timelog WHERE emp_id = 1 AND am_in > GET_TIME_IN1(emp_id, DATE)) AS tardy1, (SELECT COUNT(id) FROM timelog WHERE emp_id = 1 AND pm_in > GET_TIME_IN2(emp_i
SELECT
(SELECT
COUNT(id)
FROM timelog
WHERE emp_id = 1
AND am_in > GET_TIME_IN1(emp_id, DATE)) AS tardy1,
(SELECT
COUNT(id)
FROM timelog
WHERE emp_id = 1
AND pm_in > GET_TIME_IN2(emp_id, DATE)) AS tardy2,
(SELECT balance FROM leave_credit lc JOIN leave_type lt ON lc.leave_type_id = lt.id WHERE emp_id = 1 AND lt.active = TRUE) AS balance,
(SELECT leave_type_id FROM leave_credit lc JOIN leave_type lt ON lc.leave_type_id = lt.id WHERE emp_id = 1 AND lt.active = TRUE) AS leave_type_id
我这样做是为了从PHP到SQL server只有一个查询字符串,并在一个实例中获得所有结果。我知道子查询会影响性能,但在我的情况下,有没有更好的方法来解决我的问题
样本数据:
时间记录表
离开信用表
这里有一个替代版本:
SELECT tardy1, tardy2, balance, leave_type_id
FROM (SELECT emp_id, SUM(case when GET_TIME_IN1(emp_id, DATE) then 1 else 0 end) as tardy1,
SUM(case when pm_in > GET_TIME_IN2(emp_id, DATE) then 1 else 0 end) as tardy2
FROM timelog
WHERE emp_id = 1
group by emp_id
) tardy join
(SELECT emp_id, balance, leave_type_id
FROM leave_credit lc full outer JOIN
leave_type lt
ON lc.leave_type_id = lt.id
WHERE emp_id = 1 AND lt.active = TRUE
) balance
on tardy.emp_id = balance.emp_id
where tardy.emp_id = 1
对于所有员工:
SELECT tardy1, tardy2, balance, leave_type_id
FROM (SELECT emp_id, SUM(case when GET_TIME_IN1(emp_id, DATE) then 1 else 0 end) as tardy1,
SUM(case when pm_in > GET_TIME_IN2(emp_id, DATE) then 1 else 0 end) as tardy2
FROM timelog
group by emp_id
) tardy full outer join
(SELECT emp_id, balance, leave_type_id
FROM leave_credit lc JOIN
leave_type lt
ON lc.leave_type_id = lt.id
WHERE lt.active = TRUE
) balance
on tardy.emp_id = balance.emp_id
如果您试图组合这些子查询,您必须小心,因为
timelog
上有多行,而且员工可能在一个表中,而不是在另一个表中。您能否提供一些示例数据,以便我们可以对其进行sql处理?您的查询很好。只需分别优化这4个函数中的每一个,您就可以了。什么是GET\u TIME\u IN1()
?@ypercubeGET\u TIME\u IN1()
是一个创建的过程。谢谢您,我一定会尝试一下。