2013-01-04 31 views
0

我有一個包含4個子查詢的查詢。查詢是這樣的: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 

我做了那樣的,這樣我就只有從PHP 1個查詢字符串到SQL服務器,並得到所有結果中的實例。我知道子查詢可以影響性能,但在我的情況下是否有更好的方法來解決我的問題?

樣本數據: Timelog表 Timelog Table

休假信貸表

Leave Credit

+0

你能否提供一些示例數據,以便我們可以用sql來擺弄它? –

+0

你的查詢很好。只要分別優化每個4,你就可以了。 –

+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