SQL Count(Select)查询

时间:2016-04-29 17:47:42

标签: mysql select join count

我正在进行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语句,但我不知道如何做到这一点

附件是我的架构

ER Diagram

4 个答案:

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