按受监督人员数量分组SELECT查询

时间:2017-03-14 14:35:45

标签: mysql sql

我正在尝试为以下用户表编写一个SELECT查询,该表计算用户监督的其他人数,然后将他们的名称和他们监督的人数一起返回为两列,“SupervisorName”和“NoStaff”:< / p>

CREATE TABLE User (
userID VARCHAR(10) NOT NULL,
userName VARCHAR(100) NULL,
dateOfJoin DATE NOT NULL,
DepIDREF VARCHAR(10) NOT NULL,
userSupervisor VARCHAR(10) NULL,
PRIMARY KEY (userID),
FOREIGN KEY (DepIDREF)
REFERENCES Department (DepID)
);

INSERT INTO User VALUES 
('a10', 'Ava Perrier', '1983-06-17', 'dep10', 'e8'),
('e11', 'Ella Moncada', '1982-02-15', 'dep20', 'k1'),
('e8', 'Emily Afonso', '1985-01-12', 'dep40', 't6'),
('h3', 'Harry Moncada', '1990-03-25', 'dep10', 'null'),
('i9', 'Isla Schmitt', '1984-07-18', 'dep40', 'e8'),
('j2', 'Jack Simpson', '1985-07-30', 'dep10', 'k1'),
('k1','Karim Mualla','1986-10-16','dep10', 'null'),
('n4', 'Noah Domingues', '1989-12-05', 'dep20', 'k1'),
('o7', 'Oscar Cruz', '1986-09-11', 'dep40', 't6'),
('t6','Thomas Carvalho', '1987-04-27', 'dep30', 'w5'),
('w5', 'William Batista', '1988-05-22', 'dep20', 'h3');

我写的当前查询如下:

SELECT userName AS SupervisorName, count(userID) AS NoStaff 
FROM User WHERE userSupervisor IS NOT NULL GROUP BY userSupervisor;

然而,这个查询的结果似乎返回了所有不监督某人的人的名字以及一个我无法理解计算的数字。我在这个查询上尝试了几种变体,交换了userID和userSupervisor等,但大多数情况下我都得到了相同的结果。

任何帮助都会受到赞赏(我发现SQL非常令人困惑......)。

1 个答案:

答案 0 :(得分:4)

您需要使用useruserid字段自行加入userSupervisor表格,以获取由超级用户监督的用户列表,然后您可以按以下方式执行:

select u1.userid, u1.userName as supervisor, count(u2.userid) as no_staff
from user u1
left join user u2 on u1.userid=u2.userSupervisor
group by u1.userid, u1.userName

如果您想获得仅监控至少1个其他用户的用户列表,请将left join更改为inner join