2

提前感谢您阅读本文。我不太擅长 SQL,所以请原谅任何愚蠢的错误......

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

  1. 公司:公司标识、公司名称
  2. 用户:userId、userName
  3. 项目:projectId、projectUserId、projectCompanyId、projectDate
  4. 研究:studyProjectId

依赖关系是这样的:

  • 项目针对客户 (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。

4

2 回答 2

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子句中的条件。这种语法并没有被弃用,但是带有关键字的新语法(嗯,20 年前的 SQL-92)JOIN有几个优点。
  • 我们可以为表添加别名以提高可读性。
  • 可能有两个公司或用户同名,所以我们应该按他们的 ID 分组,而不仅仅是他们的名字。
  • 显式语法的一个优点JOIN是,当没有要加入的行时很容易得到结果(正如您想在没有项目研究时显示的那样)。只是桌子LEFT JOINstudy

因此,查询变为:

    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 ;
于 2013-06-26T07:22:32.193 回答
0

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

于 2013-06-25T18:51:03.560 回答