下面的代码是完全错误的,根本不起作用。我主要是想查看我的表格,并为一个部门的学生超过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或与此无关的东西。因为里面没有学生或系的详细信息。
如果是这样的话,我会很快把它修好的。
您需要使用inner join
,而不是left join
,因为您只需要从这三个表中选择相关行。
groupy by
和having
子句似乎很好。由于您需要学生人数超过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