SQL查询和COUNT的困难

时间:2013-06-25 17:37:17

标签: mysql-5.5 count

感谢advnace阅读本文。我对SQL并不是很擅长,所以请原谅任何愚蠢的错误......

这是交易,我有四个表(为了简单起见,我只提供基本字段和表之间的依赖关系):

  1. 公司:companyId,companyName
  2. 用户:userId,userName
  3. 项目:projectId,projectUserId,projectCompanyId,projectDate
  4. 学习:studyProjectId
  5. 依赖关系是这样的:

    • 项目是针对客户(projectUserId)并由公司执行(projectCompanyId)
    • 同一项目可以有很多研究,但每项研究都是针对一个项目(studyProjectId)

    以下是我想写的请求,但它现在不起作用:

    SELECT
        project.projectId,
        company.companyName,
        user.userName,
        COUNT( study.studyId ) AS numberStudies
    FROM project, company, user, study
    WHERE company.companyId = project.projectCompanyId,
    AND user.userId = project.projectUserId,
    AND study.studyProjectId = project.projectId
    ORDER BY company.companyId, user.userId, project.projectDate;
    

    返回一条记录,其中numberStudies等于研究总数。如果我从COUNT中移除SELECT,那么我会得到我想要的结果类型,但没有列numberStudies(当然)。希望你明白我想要得到什么,我在这里做错了什么?

    提前再次感谢:)

    编辑:如果可能,即使numberStudies为0,我也希望显示记录。

2 个答案:

答案 0 :(得分:2)

与评论中一样,当您想要汇总结果时,您需要一个GROUP BY子句(就像您想要的那样:“每个项目,公司和用户的研究数量”)。所以,首先要做的是添加:

GROUP BY project.projectId, company.companyName, user.userName

请注意,这三列恰好是SELECT列表中的三个列(未聚合)。

SELECT
    project.projectId,
    company.companyName,
    user.userName,
    COUNT(study.studyId) AS numberStudies
FROM project, company, user, study
WHERE company.companyId = project.projectCompanyId,
  AND user.userId = project.projectUserId,
  AND study.studyProjectId = project.projectId
GROUP BY project.projectId, company.companyName, user.userName
ORDER BY company.companyId, user.userId, project.projectDate ;

这将显示您想要的内容,但仍有一些问题:

  • 首先,您使用隐式连接的旧(SQL-89)语法和WHERE子句中的条件。不推荐使用此语法,但使用JOIN关键字的新(具有20年历史的SQL-92)语法有几个优点。
  • 我们可以为表添加别名以提高可读性。
  • 可能有两家公司或用户具有相同的名称,因此我们应该根据他们的ID进行分组,而不仅仅是他们的名字。
  • 显式JOIN语法的一个优点是,当没有要加入的行时,很容易获得结果(正如您希望在没有项目研究时显示)。只需LEFT JOIN study表。

因此,查询变为:

    SELECT
        p.projectId,
        c.companyName,
        u.userName,
        COUNT(s.studyId) AS numberStudies
    FROM 
        project AS p
      JOIN 
        company AS c  ON c.companyId = p.projectCompanyId
      JOIN 
        user AS u     ON u.userId = p.projectUserId
      LEFT JOIN 
        study AS s    ON s.studyProjectId = p.projectId
    GROUP BY 
        c.companyId,
        u.userId,
        p.projectId, 
        c.companyName,  u.userName
    ORDER BY 
        c.companyId, 
        u.userId, 
        p.projectDate ;

答案 1 :(得分:0)

你可能需要在学习和项目之间进行LEFT JOIN