繁体   English   中英

MySQL子查询替代

[英]MySQL Subquery Alternative

我有一个包含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_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

我这样做是为了让我只有1个查询字符串(从PHP到SQL服务器),并将所有结果存储在一个实例中。 我知道子查询会影响性能,但是在我的情况下,有没有更好的方法来解决我的问题?

样本数据:Timelog表 时间记录表

离开信用表

离开信用

这是替代版本:

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上有多行,而且雇员可能在一个表中,而不在另一个表中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM