感谢advnace阅读本文。我对SQL并不是很擅长,所以请原谅任何愚蠢的错误......
这是交易,我有四个表(为了简单起见,我只提供基本字段和表之间的依赖关系):
依赖关系是这样的:
以下是我想写的请求,但它现在不起作用:
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,我也希望显示记录。
答案 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 ;
这将显示您想要的内容,但仍有一些问题:
WHERE
子句中的条件。不推荐使用此语法,但使用JOIN
关键字的新(具有20年历史的SQL-92)语法有几个优点。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