【问题标题】:Having trouble a query and specifically with joins查询有问题,特别是连接问题
【发布时间】:2021-06-29 07:29:27
【问题描述】:

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

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

所以基本上一个部门连接到一个模块,一个学生就读于一个模块。学生不能参加他们部门之外的模块。所以每个学生都应该有一个模块连接到一个部门

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

相关表格列

表部 DeptID, DeptName, Faculty, Address

表格模块 ModuleID, ModuleName, DeptID, Programme

表学生 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 来获取他们教授的模块或与此无关的内容。因为那里没有学生或部门的详细信息。

如果是这样,我会很快解决。

【问题讨论】:

    标签: mysql sql phpmyadmin


    【解决方案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 )
    

    【讨论】:

      【解决方案2】:

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

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

      由于您要计算每个部门名称的行数,您可以简单地执行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
      

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

      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
      

      【讨论】:

        【解决方案3】:

        您需要使用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
        

        【讨论】:

          猜你喜欢
          • 2010-09-22
          • 2013-03-27
          • 2013-03-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-04
          相关资源
          最近更新 更多