Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL子查询替代方案_Mysql - Fatal编程技术网

MySQL子查询替代方案

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

我有一个包含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
我这样做是为了从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()
?@ypercube
GET\u TIME\u IN1()
是一个创建的过程。谢谢您,我一定会尝试一下。