2014-11-20 45 views
0
SELECT 
    (SELECT COALESCE(SUM(t.hours), 0) AS allotted_hours 
    FROM tasks AS t 
    WHERE t.projects_id = 8 
    AND t.complete != 100 
    AND t.name LIKE '%Ongoing%' 
    AND t.name NOT LIKE '%Placeholder%') AS allotted_hours_notcomplete_ongoing, 

    (SELECT COALESCE(SUM(tl.hours), 0) AS hr 
    FROM tasks AS t 
    INNER JOIN tasklogs AS tl ON (tl.tasks_id = t.id) 
    WHERE t.projects_id = 8 
    AND t.complete != 100 
    AND t.name LIKE '%Ongoing%' 
    AND t.name NOT LIKE '%Placeholder%') AS logged_hours_notcomplete_ongoing, 

    (SELECT (allotted_hours_notcomplete_ongoing - logged_hours_notcomplete_ongoing) + logged_hours_notcomplete_ongoing) AS difference_notcomplete_ongoing, 

    (SELECT COALESCE(SUM(t.hours), 0) AS hr 
    FROM tasks AS t 
    WHERE t.projects_id = 8 
    AND t.complete != 100 
    AND t.name NOT LIKE '%Ongoing%' 
    AND t.name NOT LIKE 'Placeholder%') AS allotted_hours_notcomplete_regular, 

    (SELECT COALESCE(SUM(tl.hours), 0) AS hr 
    FROM tasklogs AS tl 
    INNER JOIN tasks AS t ON (t.id = tl.tasks_id 
          AND t.projects_id = 8 
          AND t.complete = 100) 
    WHERE hourtypes_id IN (1, 
          2)) AS logged_hours_complete, 

    (SELECT logged_hours_complete + allotted_hours_notcomplete_regular + difference_notcomplete_ongoing) AS total 

我基本上是試圖優化這個查詢,以計算給定項目的任務小時,然後再合併到我的基地SELECT * FROM projects查詢。如何使用5個子查詢優化此查詢?

這些子查詢的1只從tasks表中進行選擇,這些的2從tasks選擇和INNER上tasklogs或反之亦然,以及這些的2 JOIN是簡單的計算彼此。

有沒有更有效的方法來優化這個?我從來沒有使用臨時表,但也許我可以首先從給定的項目ID中選擇tasks中的所有任務,然後從該臨時表中執行我以後的SELECT操作?希望得到任何建議。

如果需要,我可以用sql小提琴複製模式,但這需要一些時間。

回答

1

您從同一個表中不止一次地傳遞。沒有任何執行計劃,我會嘗試像第一個一樣。

SELECT 
    (SELECT SUM(GT.tHours) FROM GT 
    WHERE 1 = 1 
    AND t.name LIKE '%Ongoing%' 
    AND t.name NOT LIKE '%Placeholder%' 
    ) AS allotted_hours_notcomplete_ongoing 
    , 
    (SELECT SUM(GT.tlHours) FROM GT 
    WHERE 1 = 1 
    AND t.name LIKE '%Ongoing%' 
    AND t.name NOT LIKE '%Placeholder%' 
    ) AS logged_hours_notcomplete_ongoing 
    (SELECT SUM(GT.tlHours) FROM GT 
    WHERE 1 = 1 
    AND t.name LIKE '%Ongoing%' 
    AND t.name NOT LIKE '%Placeholder%' 
    AND hourtypes_id IN (1, 
          2)) 

    ) AS logged_hours_complete, 
    (SELECT (allotted_hours_notcomplete_ongoing - logged_hours_notcomplete_ongoing) + logged_hours_notcomplete_ongoing) AS difference_notcomplete_ongoing, 

    (SELECT COALESCE(SUM(thours), 0) AS hr 
    FROM GT 
    WHERE 
    AND t.name NOT LIKE '%Ongoing%' 
    AND t.name NOT LIKE 'Placeholder%') AS allotted_hours_notcomplete_regular, 


    FROM 
    (
    SELECT SUM(t.hours) AS tHours ,SUM(tl.hours) AS tlHours, t.name,hourtypes_id 
    FROM tasks AS t 
    LEFT JOIN tasklogs AS tl ON (tl.tasks_id = t.id) 
    WHERE t.projects_id = 8 
    AND t.complete != 100 
    GROUP BY t.name,hourtypes_id 
    ) GT 

我基本上只嘗試總和小時一次。之後,我會過濾使用內部選擇和在哪裏。你當然需要以下索引。

任務

t.id 
t.projects_id 
t.complete 
t.name 
hourtypes_id 
t.hours 

tasklogs

tl.tasks_id 
tl.hours 

我認爲hourtypes_id在任務表。