2011-08-28 82 views
0

(查詢更新的cdhowie評論)MySQL的子查詢與重寫問題

計數這裏的情況。 我想要「統計分配給每個工作人員的任務位置類型1,2和任務部門類型3,4內的任務數量」。

假設我有以下各表

Task : id, Name 
Task_Worker_Combi : Task_id, Worker_id 
Worker : id, Name 
Task_Location_Combi : Task_id, Location_id 
Task_Department_Combi : Task_id, Department_id 
Location : id, Name 
Department : id, Name 

我得到儘可能如下:(但是,因爲它永遠都必須有查詢的一些錯誤)

SELECT W.id, W.Name, COUNT(TWC.Task_id) AS Count 
FROM Worker AS W 
LEFT JOIN Task_Worker_Combi AS TWC 
    ON (W.id=TWC.Worker_id) 
WHERE W.id>0 AND TWC.Task_id IN 
(
    SELECT T.id 
    FROM Task as T 
    LEFT JOIN (Task_Location_Combi AS TLC, Task_Department_Combi AS TDC) 
     ON (T.id=TLC.Task_id AND T.id=TDC.Task_id) 
    WHERE 1 AND TLC.Location_id IN (1,2) AND TDC.Department_id IN (3,4) 
    GROUP BY T.id 
) 
GROUP BY W.id 
ORDER BY W.Name 

沒有這個子查詢它返回「無條件分配給每個工人的任務數量」罰款。

AND TWC.Task_id IN 
(
    SELECT T.id 
    FROM Task as T 
    LEFT JOIN (Task_Location_Combi AS TLC, Task_Department_Combi AS TDC) 
     ON (T.id=TLC.Task_id AND T.id=TDC.Task_id) 
    WHERE 1 AND TLC.Location_id IN (1,2) AND TDC.Department_id IN (3,4) 
    GROUP BY T.id 
) 

哪裏出錯了,你將如何重寫這個查詢來有效地工作?請幫助我一個人。我在這裏呆了一個多星期了!

實際查詢如下。 (假設Job爲Task and Worker as Industry as Industry from above查詢簡體)

EXPLAIN SELECT id, Name, COUNT(J.Industry) AS Count 
FROM industry_db.industry AS I 
LEFT JOIN job_db.industry AS J ON (I.id = J.Industry) 
WHERE I.id >0 
AND J.Job 
IN (

SELECT t1.id 
FROM job_db.job AS t1 
LEFT JOIN (
company_db.company AS t2, job_db.industry AS t3, location_db.city AS t4, job_db.function AS t5, job_db.tag AS t6, job_db.degree AS t7, location_db.state AS t8, location_db.group AS t9 
) ON (t1.Company = t2.id 
AND t1.id = t3.Job 
AND t1.City = t4.id 
AND t1.id = t5.Job 
AND t1.id = t6.Job 
AND t1.id = t7.Job 
AND t1.State = t8.id 
AND t1.State_Group = t9.id) 
WHERE 1 
AND t1.Open = '1' 
GROUP BY t1.id) 
GROUP BY id 
HAVING Count >0 
ORDER BY Name 

而phpmyadmin的解釋結果如下。

id select_type table type possible_keys key key_len ref rows Extra 
1 PRIMARY I range PRIMARY,id PRIMARY 1 NULL 39 Using where; Using temporary; Using filesort 
1 PRIMARY J ref Industry Industry 1 industry_db.I.id 403 Using where 
2 DEPENDENT SUBQUERY t1 index NULL PRIMARY 4 NULL 2868 Using where 
2 DEPENDENT SUBQUERY t9 eq_ref PRIMARY PRIMARY 1 job_db.t1.State_Group 1 Using index 
2 DEPENDENT SUBQUERY t2 eq_ref PRIMARY PRIMARY 2 job_db.t1.Company 1 Using index 
2 DEPENDENT SUBQUERY t8 eq_ref PRIMARY PRIMARY 1 job_db.t1.State 1 Using index 
2 DEPENDENT SUBQUERY t4 eq_ref PRIMARY PRIMARY 4 job_db.t1.City 1 Using index 
2 DEPENDENT SUBQUERY t7 ref PRIMARY PRIMARY 4 job_db.t1.id 1 Using index 
2 DEPENDENT SUBQUERY t3 ref Job Job 4 job_db.t1.id 1 Using index 
2 DEPENDENT SUBQUERY t5 ref PRIMARY PRIMARY 4 job_db.t7.Job 1 Using index 
2 DEPENDENT SUBQUERY t6 ref PRIMARY PRIMARY 4 job_db.t7.Job 2 Using index 
+1

第一步優化查詢的時候:使用'EXPLAIN',查找表掃描。 – cdhowie

+1

另外,這是你使用的真正的查詢? 「W」表來自哪裏?我沒有看到它在查詢中的任何位置,在'FROM'或'JOIN'子句中定義。 – cdhowie

+1

由於我們在TWC.Task_Id ..... –

回答

3

試試這個:

SELECT w.id, w.Name, COUNT(tw.Task_id) 
FROM Worker AS w 
LEFT JOIN Task_Worker_Combi AS tw 
ON(
    w.id = tw.Worker_id AND 
    EXISTS(SELECT Task_id FROM Task_Location_Combi 
      WHERE Task_id = tw.TaskId AND Location_id IN(1, 2)) AND 
    EXISTS(SELECT Task_id FROM Task_Department_Combi 
      WHERE Task_id = tw_TaskId AND Department_id IN(3, 4)) 
) 
+0

哇這是一個新的rewrtie。我會嘗試並讓你知道。再次感謝你。 – user706087

+0

這工作,但我得到相同的時候我「選擇w.id,w.Name,COUNT(tw.Task_id)從工人AS w左連接Task_Worker_Combi AS TW ON(w.id = tw.Worker_id)WHERE EXISTS(SELECT Task_id FROM Task_Location_Combi WHERE Task_id = tw。TaskId AND Location_id IN(1,2))AND EXISTS(SELECT Task_id FROM Task_Department_Combi WHERE Task_id = tw_TaskId AND Department_id IN(3,4))「。這是錯誤的嗎? – user706087

+0

@user您的版本適用於沒有匹配的工作人員任務你沒有得到任何行,用我原來的查詢,你爲每一個零計數的工人得到一個行 – nobody