我正在进行SQL查询以执行以下操作:
对于每个项目,检索项目编号,项目名称,处理该项目的员工数量。
这是我到目前为止所做的:
select pno, pname,
count(select fname from
employee inner join works_on
on employee.ssn=works_on.essn
inner join project
on works_on.pno=project.pno)
as num_emp from project
这给了我这个错误:
1064 - 您的SQL语法出错;查看与您的MySQL服务器版本对应的手册,以便在第1行的employee.ssn = works_on.essn inn'上的'select fname from employee inner join works_on'附近使用正确的语法
我假设的意思是我不能在计数函数中放入一个select语句,但我不知道如何做到这一点
附件是我的架构
答案 0 :(得分:0)
您不需要子查询
按其他字段计算(员工ID)和分组
答案 1 :(得分:0)
COUNT(*)
使用普通加入和GROUP BY
。
select p.pno, p.pname, COUNT(*) AS num_emp
FROM project AS p
JOIN works_on AS w ON w.pno = p.pno
GROUP BY p.pno
您不需要加入employee
表,因为您没有使用该表中的任何信息 - 所有信息都在works_on
。
如果您需要包含没有员工处理项目的项目,则需要使用左连接。
select p.pno, p.pname, COUNT(w.pno) AS num_emp
FROM project AS p
LEFT JOIN works_on AS w ON w.pno = p.pno
GROUP BY p.pno
如果同一项目+员工works_on
中可能有多个条目,则在查询中使用COUNT(DISTINCT w.essn)
,这样就不会多次计算。
答案 2 :(得分:0)
你可以这样做:
SELECT pno, pname,count(fname) AS Cnt
FROM employee, works_on, project
WHERE employee.ssn=works_on.essn
AND works_on.pno=project.pno
GROUP BY pno,pname
答案 3 :(得分:0)
我会这样做,按照您希望员工数量的项目详细信息进行分组:
SELECT
pno,
pname,
COUNT(employee.snn) AS num_emp
FROM
project
INNER JOIN
works_on
ON works_on.pno = project.pno
INNER JOIN
employee
ON employee.ssn = works_on.essn
GROUP BY
pno,
pname;
修改强>
实际上,如果您想列出没有分配员工的项目,那么您可以通过以下方式使原始查询更正确:
SELECT
pno,
pname,
(
SELECT
COUNT(fname)
FROM
employee
INNER JOIN
works_on
ON employee.ssn = works_on.essn
WHERE
works_on.pno = project.pno
) AS num_emp
FROM
project;