2016-02-26 104 views
0

我正在做一個查詢,我從一個名爲employee的表中選擇所有表,並且希望從另外兩個表中計數employee_id並在2個獨立列中表示計數。從一個表中選擇其他兩個表的計數

的表格:

  1. 僱員[ID等]
  2. 報告[ID,EMPLOYEE_ID等]
  3. office_report [ID,EMPLOYEE_ID等]

我到目前爲止所做的是:

SELECT emp.*, COUNT(rep.id) no_of_field_reports, COUNT(of_rep.id) no_of_office_reports 
FROM employee emp 
LEFT JOIN report rep 
    ON (emp.id = rep.employee_id) 
LEFT JOIN office_report of_rep 
    ON (emp.id = of_rep.employee_id) 
WHERE emp.user_id =7 AND emp.active = 1 
GROUP BY emp.id, emp.name 
ORDER BY emp.name ASC 

問題是,只要我在報告表中有報告,計數就會紊亂起來。說我有報告表和2 16份報告office_report表,爲no_of_field_reportsno_of_office_reports計數將成爲32

林失去了一些東西很明顯,但因爲我不是一個天才SQL我無法弄清楚什麼。

請務必解釋是什麼導致了問題,所以我可以從我的錯誤中學習,並更好地理解這些類型的查詢,因爲這不會是最後一次。

我想答案會在一般的MariaDB的,MySQL的相同,SQL,所以我將所有這些標籤對注意力的緣故..也許一個方法,如果你是不同的計數後(雖然

+0

幾個選項。對每個表使用唯一ID的不同計數,或將計數作爲內聯視圖。計數混亂的原因是由於表之間的基數誇大了計數。 – xQbert

+0

@xQbert添加DISTINCT到我的SELECT似乎沒有工作..我想我做錯了.. – DTH

回答

1

您可能需要調整到PK場)

SELECT emp.*, 
     COUNT(distinct rep.id) no_of_field_reports, --may need to be on Unique key instead 
     COUNT(distinct of_rep.id) no_of_office_reports --may need to be on Unique key instead) 
FROM employee emp 
LEFT JOIN report rep 
    ON (emp.id = rep.employee_id) 
LEFT JOIN office_report of_rep 
    ON (emp.id = of_rep.employee_id) 
WHERE emp.user_id =7 AND emp.active = 1 
GROUP BY emp.id, emp.name 
ORDER BY emp.name ASC 

的方法獲取計數加入之前,如果你以後重複計數不是那麼這很可能是正確的做法,並提供靈活性。

SELECT emp.*, rep.cnt, of_Rep.cnt 
FROM employee emp 
LEFT JOIN (SELECT count(ID) cnt , employee_ID 
      FROM REPORT 
      GROUP BY employee_ID) rep 
    ON (emp.id = rep.employee_id) 
LEFT JOIN (SELECT count(ID) cnt, Employee_ID  
      FROM office_report 
      GROUP BY employee_ID) of_rep 
    ON (emp.id = of_Rep.employee_id) 
WHERE emp.user_id =7 AND emp.active = 1 
GROUP BY emp.id, emp.name 
ORDER BY emp.name ASC 

或使用相關查詢(但不支持所有的時間,例如在創建物化從這個SQL視圖)

SELECT emp.*, 
     (SELECT count(ID) 
     FROM REPORT 
     WHERE emp.id = rep.employee_id) Report_Cnt, 
     (SELECT count(ID) 
     FROM office_report of_REP 
     WHERE emp.id = of_Rep.employee_id) of_Rep_Cnt 
FROM employee emp 
WHERE emp.user_id =7 AND emp.active = 1 
GROUP BY emp.id, emp.name 
ORDER BY emp.name ASC 
+0

不錯..但爲什麼我需要調整PK? – DTH

+0

我不知道ID是唯一的還是PK'...這就是我說你可能需要調整。因爲他們是PK的,你應該沒問題。 – xQbert

+0

報告ID也是唯一的..所以調整不應該是正確的? – DTH

相關問題