虽然我不是SQL或MySQL的新手,但我注意到还有很多需要学习的东西。经过多次尝试,阅读和搜索后,我无法理解这一点。如果你能给出任何指示,我将不胜感激。
我已将实际数据和表格简化为以下内容。
两个表是相关的:员工和工作。它们包含各种项目的工作人员数据。
员工:
ID Name Unit
1 Smith Chicago
2 Clarke London
3 Hess Chicago
工作:
StaffID ProjectID
1 10
2 10
3 10
1 20
2 30
3 40
1 50
3 50
目标:
将所有那些有芝加哥员工的项目分组,并计算该项目中所有员工的人数。
预期结果:
Project Staff count
10 3
20 1
40 1
50 2
因此,项目30未列出,因为其成员不是来自芝加哥。
我的查询显然是错误的。它只计算来自芝加哥的项目成员,而不是整个项目人员。
SELECT
work.projectID as Project, COUNT(*) as "Staff count"
FROM
staff
JOIN
work ON staff.ID=work.staffID
WHERE
unit="Chicago"
GROUP BY
work.projectID;
答案 0 :(得分:3)
我将芝加哥的测试放在子选项中 或者,您可以使用自联接,但我发现子选择更容易理解。
SELECT
w.projectid as project
,COUNT(*) as `staff count`
FROM work w
INNER JOIN staff s ON (w.staffID = s.id)
WHERE w.projectID IN (
SELECT w2.projectID FROM work w2
INNER JOIN staff s2 ON (w2.staffID = s2.id AND s2.unit = 'Chicago'))
GROUP BY w.projectid
答案 1 :(得分:3)
删除where子句并添加一个having子句,用于检查至少有一名员工来自芝加哥。
SELECT
work.projectID as Project, COUNT(*) as "Staff count"
FROM
staff
JOIN
work ON staff.ID=work.staffID
GROUP BY
work.projectID
HAVING
count(case unit when 'Chicago' then 1 end) > 0;
答案 2 :(得分:1)
最后:结果。再次感谢@Johan和@ a'r的帮助,以及@Johan让我走上正轨(就我而言)。
我将子选择更改为派生表,并使用projectID上的Work表进行内部连接。
SELECT
w.projectID AS project
,COUNT(*) AS `staff count`
FROM work w
INNER JOIN
(SELECT DISTINCT w2.projectID
FROM work w2
INNER JOIN staff s ON (w2.staffID = s.id AND s.unit = 'Chicago')) c
ON (w.projectID = c.projectID)
GROUP BY w.projectID