Select 来自一个 table 和另外两个 table 的计数
Select from one table with count from two other tables
我正在做一个查询,其中我 select 全部来自一个叫 table 的员工,我想对另外两个 table 的 employee_id 进行计数,并且在 2 个单独的列中表示计数。
tables:
- 员工[id等]
- 举报 [id, employee_id, 等等]
- 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_reports和no_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
我正在做一个查询,其中我 select 全部来自一个叫 table 的员工,我想对另外两个 table 的 employee_id 进行计数,并且在 2 个单独的列中表示计数。
tables:
- 员工[id等]
- 举报 [id, employee_id, 等等]
- 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_reports和no_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