提问者:小点点

查询有问题,特别是连接有问题


下面的代码是完全错误的,根本不起作用。我主要是想查看我的表格,并为一个部门的学生超过40人的部门编制一个DeptName和学生总数的列表。

我对一般的加入感到困惑,如果有人能解释并指出我的错误之处。我肯定还有其他问题,所以任何帮助都会有帮助

所以基本上是一个系接一个模块,一个学生入一个模块。学生不能选修本系以外的课程。所以每个学生应该有一个模块连接到一个系

其他表中的所有ID字段都是外键,您可以猜到,更改表并不是我想在这里做的,我只想按现在的情况做这个查询

相关表列

表DepartmentDeptID,DeptName,Faculty,Address

表模块moduleid,modulename,deptid,programe

表学生studentid,studentname,dob,address,studytype,`

表注册eID,studentid,moduleid,学期,年份

SELECT Department.DeptName, COUNT(Student.StudentID) AS 'No of Students'  FROM Department LEFT JOIN Module ON Department.DeptID= Module.DeptID LEFT JOIN Enrolment ON Module.ModuleID=  Enrolment.StudentID LEFT JOIN Student.StudentID 
GROUP BY(Department.DeptID)
HAVING COUNT(Student.StudentID)>=40

我没有把这里的每一张桌子都包括在内,因为有很多。

但是,除非我完全搞错了,否则您不需要访问他们所教模块的staff表中的ModuleID或与此无关的东西。因为里面没有学生或系的详细信息。

如果是这样的话,我会很快把它修好的。


共2个答案

匿名用户

您需要使用inner join,而不是left join,因为您只需要从这三个表中选择相关行。

groupy byhaving子句似乎很好。由于您需要学生人数超过40人的院系,而不是>=请使用count(e.studentId)>40

SELECT d.DeptName, COUNT(e.StudentID) AS 'No of Students'  FROM Department d INNER JOIN Module m ON d.DeptID= m.DeptID inner JOIN Enrolment e ON m.ModuleID=  e.StudentID LEFT JOIN Student.StudentID 
GROUP BY(d.DeptName)
HAVING COUNT(e.StudentID)>40

匿名用户

因此,在编写join子句时,students对它有点不确定,推测这些都应该是内部join。

我使用别名重新设置了查询的格式,使其更容易阅读。

由于要计算每个DeptName的行数,您可以简单地执行count(*),同样地,在having中,您只计算大于40的计数。在没有看到架构和数据的情况下,不可能知道是否有重复的学生,如果是这种情况,并且您想要distinct Students count可以修改为count(distinct s.studentid)

select d.DeptName, Count(*) as 'No of Students'  
from Department d
join Module m on m.DeptId=d.DeptId
join Enrolment e on e.StudentId=m.ModuleId
join Students s on s.StudentId=e.studentId
group by(d.DeptName)
having Count(*)>40

此外,查看您的加入条件,注册表是否相关?

select d.DeptName, Count(*) as 'No of Students'  
from Department d
join Module m on m.DeptId=d.DeptId
join Students s on s.StudentId=m.moduleId
group by(d.DeptName)
having Count(*)>40