Select 来自一个 table 和另外两个 table 的计数

Select from one table with count from two other tables

我正在做一个查询,其中我 select 全部来自一个叫 table 的员工,我想对另外两个 table 的 employee_id 进行计数,并且在 2 个单独的列中表示计数。

tables:

  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

问题是,一旦我在两个报告 table 中都有报告,计数就会混乱。假设我在 report table 中有 16 个报告,在 office_report table 中有 2 个报告,no_of_field_reportsno_of_office_reports会变成32。

我显然遗漏了一些东西,但由于我不是 SQL 天才,所以我不知道是什么。

请务必解释导致问题的原因,以便我能够从错误中吸取教训并更好地理解这些类型的查询,因为这不会是最后一次。

我想 mariaDB、mySQL 和 SQL 的答案通常是相同的,所以为了引起注意我添加了所有这些标签..

如果您追求不同的计数,可能是一种方法(尽管您可能需要调整 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