【问题标题】:SQL Count(Select) QuerySQL 计数(选择)查询
【发布时间】:2016-08-24 23:34:49
【问题描述】:

我正在处理一个 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 行的“select fname from employee inner joinworks_on on employee.ssn=works_on.essn inn”附近使用正确的语法

我假设这意味着我不能将 select 语句放在 count 函数中,但我不知道该怎么做

附上我的架构

【问题讨论】:

    标签: mysql select join count


    【解决方案1】:

    我会这样做,根据您希望员工人数统计的项目详细信息进行分组:

    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;
    

    【讨论】:

      【解决方案2】:

      你不需要子查询

      计数(员工 ID)并按其他字段分组

      【讨论】:

        【解决方案3】:

        你可以这样做:

        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
        

        【讨论】:

          【解决方案4】:

          使用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),这样它们就不会被多次计算。

          【讨论】:

          • 可能会导致问题,如果同一个员工有多个条目,它们会被计算两次。
          • @VikingBlooded 为什么您会多次输入同一个员工进行一个项目?在任何合理的设计中,pno, essn 将是 works_on 表中的唯一键。
          • works_on 是一个联接,完全有可能在不同的时间多次输入员工。在现实世界的环境中,这是完全可能的。
          • 我猜hours 是总小时数,而不是时间表,所以只有一个条目。不幸的是,图表没有显示键。
          • 是的,这也是我最初的想法,但是,在野外,谁知道他们最终会做什么。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-03-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多