Mysql 在查询中遇到问题,特别是在连接方面
下面的代码完全错误,根本不起作用。我基本上是在浏览我的表格,为一个有40多名学生的系编制一份部门名称和学生总数的清单 我对一般的连接感到困惑,是否有人能解释并说明我哪里出了问题。我肯定还有其他问题,所以任何帮助都会有帮助 所以基本上一个系和一个模块相连,一个学生注册一个模块。学生不能在系外学习模块。所以每个学生都应该有一个模块连接到一个系 其他表中的所有ID字段都是外键,您可以猜到,更改表并不是我想在这里做的事情,我只想按原样执行此查询 相关表格和列 表部门Mysql 在查询中遇到问题,特别是在连接方面,mysql,sql,phpmyadmin,Mysql,Sql,Phpmyadmin,下面的代码完全错误,根本不起作用。我基本上是在浏览我的表格,为一个有40多名学生的系编制一份部门名称和学生总数的清单 我对一般的连接感到困惑,是否有人能解释并说明我哪里出了问题。我肯定还有其他问题,所以任何帮助都会有帮助 所以基本上一个系和一个模块相连,一个学生注册一个模块。学生不能在系外学习模块。所以每个学生都应该有一个模块连接到一个系 其他表中的所有ID字段都是外键,您可以猜到,更改表并不是我想在这里做的事情,我只想按原样执行此查询 相关表格和列 表部门DeptID,DeptName,教员,
DeptID
,DeptName
,教员
,地址
表格模块ModuleID
,ModuleName
,DeptID
,程序
表格学生学生ID
,学生姓名
,DoB
,地址
,学生类型
`
表注册人数EID
,学生ID
,模块ID
,学期
,年份
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
我没有把这里的每一张桌子都包括进去,因为有很多
但除非我完全弄错了,否则你不需要访问教职员工表中他们教授的模块的ModuleID或与此无关的内容。因为里面没有学生或系的详细信息
如果是这种情况,我会很快修复它。您需要使用
内部联接,而不是左联接
,因为您只需要从这三个表中选择相关行
Groupy by
和具有
子句似乎很好。由于您需要的是学生人数超过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子句对学生来说有点不太确定,大概这些都应该是内部连接
我已使用别名重新格式化了您的查询,以使其更易于阅读
由于您正在计算每个部门名称的行数,因此只需执行count(*)
,同样地,在中,您只需要计算大于40的行数。如果不查看您的模式和数据,就无法知道您是否有重复的学生,如果是这种情况,并且您希望不同的学生计数可以修改为count(不同的s.studentId)
另外,看看您的加入条件,登记表是否相关
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
您正在使用错误的字段连接这两个表。通常,在正确完成建模后,应使用USING
而不是ON
进行连接
任何JOIN
运算符的右侧必须是表,而不是列
必须按select子句中不属于聚合函数(如COUNT
)的每一列进行分组。我建议您选择DeptID而不是名称,然后使用此查询的结果在后续选择中查找名称
注意:以下代码未经测试
WITH bigDepts AS (
SELECT DeptId, COUNT(StudentID) AS StudentCount
FROM Department
JOIN Module
USING ( DeptID )
JOIN Enrolment
USING ( ModuleID )
JOIN Student
USING ( StudentID )
GROUP BY DeptID
HAVING COUNT(StudentID)>=40
)
SELECT DeptID, DeptName, StudentCount
FROM Department
JOIN bigDepts
USING ( DeptID )
SELECT Department.DeptName, COUNT(Student.StudentID) AS 'No of Students'
FROM Department
LEFT JOIN Module
ON Department.DeptID= Module.DeptID
LEFT JOIN Enrolment
-- problem #1:
ON Module.ModuleID= Enrolment.StudentID
-- problem #2:
LEFT JOIN Student.StudentID
-- problem #3:
GROUP BY(Department.DeptID)
HAVING COUNT(Student.StudentID)>=40
WITH bigDepts AS (
SELECT DeptId, COUNT(StudentID) AS StudentCount
FROM Department
JOIN Module
USING ( DeptID )
JOIN Enrolment
USING ( ModuleID )
JOIN Student
USING ( StudentID )
GROUP BY DeptID
HAVING COUNT(StudentID)>=40
)
SELECT DeptID, DeptName, StudentCount
FROM Department
JOIN bigDepts
USING ( DeptID )