2013-01-04 2 views
0

4 개의 하위 쿼리로 구성된 쿼리가 있습니다. 쿼리는 이것이다 : 나는 단지 SQL 서버에 PHP에서 1 개 쿼리 문자열이 있고 인스턴스의 모든 결과를 얻을 것입니다 수 있도록MySQL 하위 쿼리 대체

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 

내가 그런 식으로했다. 하위 쿼리는 성능에 영향을 미칠 수 있지만 내 상황에서는 내 문제를 해결할 수있는 더 나은 방법이 있습니까?

샘플 데이터 : TimeLog라는 표 Timelog Table

남기기 신용 표

여기 Leave Credit

+0

몇 가지 예제 데이터를 제공하여 SQL을 피할 수 있습니까? –

+0

귀하의 질의에 문제가 없습니다. 4 개 모두를 개별적으로 최적화하면 OK입니다. –

+0

'GET_TIME_IN1()'이란 무엇입니까? –

답변

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 
     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의 여러 행과 직원이 한 테이블에 있지만 다른 테이블에는 없기 때문에 조심해야합니다.

+0

고마워, 분명히 시도해 볼게. – Durty