Mysql 在查询中遇到问题,特别是在连接方面

Mysql 在查询中遇到问题,特别是在连接方面,mysql,sql,phpmyadmin,Mysql,Sql,Phpmyadmin,下面的代码完全错误,根本不起作用。我基本上是在浏览我的表格,为一个有40多名学生的系编制一份部门名称和学生总数的清单 我对一般的连接感到困惑,是否有人能解释并说明我哪里出了问题。我肯定还有其他问题,所以任何帮助都会有帮助 所以基本上一个系和一个模块相连,一个学生注册一个模块。学生不能在系外学习模块。所以每个学生都应该有一个模块连接到一个系 其他表中的所有ID字段都是外键,您可以猜到,更改表并不是我想在这里做的事情,我只想按原样执行此查询 相关表格和列 表部门DeptID,DeptName,教员,

下面的代码完全错误,根本不起作用。我基本上是在浏览我的表格,为一个有40多名学生的系编制一份部门名称和学生总数的清单

我对一般的连接感到困惑,是否有人能解释并说明我哪里出了问题。我肯定还有其他问题,所以任何帮助都会有帮助

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

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

相关表格和列

表部门
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 )