根据列值进行分组,计数和排除

时间:2011-10-10 13:59:18

标签: mysql join group-by inner-join derived-table

虽然我不是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;

3 个答案:

答案 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