遇到查询问题,特别是连接问题

时间:2021-04-02 12:06:55

标签: mysql sql phpmyadmin

下面的代码完全错误,根本不起作用。我基本上是在尝试查看我的表格并为一个部门拥有超过 40 名学生的部门编制一份 DeptName 列表和总学生人数。

我对联接感到困惑,如果有人可以解释并指出我哪里出错了。我确定还有其他问题,所以对他们的任何帮助都会有所帮助

所以基本上一个系连接到一个模块,一个学生注册一个模块。学生不能在其系外学习模块。所以每个学生应该有一个模块连接到一个部门

其他表中的所有 ID 字段都是外键,因为您可以猜到,更改表不是我想要在这里做的,我只想按原样执行此查询

相关表格列

餐桌部 DeptIDDeptNameFacultyAddress

表格模块 ModuleIDModuleNameDeptIDProgramme

表学生 StudentID,StudentName,DoB,Address,StudyType,`

表格注册 EID,StudentID,ModuleID,Semester,Year

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 或根本与此无关的内容。因为那里没有学生或系的详细信息。

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

3 个答案:

答案 0 :(得分:1)

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
  1. 您使用错误的字段连接这两个表。通常,当建模正确完成后,您应该使用 USING 而不是 ON 进行连接
  2. 任何 JOIN 运算符的右侧都必须是表,而不是列。
  3. 您必须按 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 )

答案 1 :(得分:0)

您需要使用 left join 而不是 inner 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

答案 2 :(得分:0)

所以你的 join 子句在你写的时候对 students 有点不确定,大概这些应该都是内连接。

我已经使用别名重新格式化了您的查询以使其更易于阅读。

由于您要计算每个 DeptName 的行数,因此您只需执行 count(*),同样在您的 having 中,您只需要计数大于 40。如果没有看到您的架构和数据,就不可能知道您是否可能有重复的学生,如果是这种情况并且您希望不同的学生计数可以修改为 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

另外,看看你的加入条件,Enrolement 表是相关的吗?

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