Mysql 如何编写正确的查询以查找当前未参加课程的学生

Mysql 如何编写正确的查询以查找当前未参加课程的学生,mysql,sql,database,Mysql,Sql,Database,我正在努力寻找剩余的学生,他们可以报名参加一门课程。要做到这一点,我需要找到目前活跃的学生和目前不在课程中的学生。但是我认为我写的查询是不正确的,因为当我运行查询时,它一直显示一组空的结果。我如何才能找到能够注册课程的剩余学生 以下是当前查询: SELECT st.StudentId, StudentAlias, StudentForename, StudentSurname FROM Course c INNER JOIN Student_Course sc

我正在努力寻找剩余的学生,他们可以报名参加一门课程。要做到这一点,我需要找到目前活跃的学生和目前不在课程中的学生。但是我认为我写的查询是不正确的,因为当我运行查询时,它一直显示一组空的结果。我如何才能找到能够注册课程的剩余学生

以下是当前查询:

SELECT  st.StudentId, StudentAlias, StudentForename, StudentSurname
FROM    Course c
        INNER JOIN Student_Course sc
            ON c.CourseId = sc.CourseId
        INNER JOIN Student st
            ON sc.StudentId = st.StudentId
WHERE   (c.CourseId = 1 AND
        sc.StudentId IS NULL
        AND st.Active = 1)
ORDER   BY st.StudentAlias
下表如下:

学生:(所有学生名单)

课程:(所有课程列表)

学生课程:(各课程注册学生名单)

因此,例如,如果我选择了
CourseId=1
,那么它应该显示活跃但显然不在
CourseId=1
中的学生,这意味着它应该在下面显示这些学生,以便注册到课程中:

4 - Chris Cameron
5 - Jane Fields
试试这个

SELECT  st.StudentId, StudentAlias, StudentForename, StudentSurname
FROM    Course c
        INNER JOIN Student_Course sc
            ON c.CourseId = sc.CourseId
        INNER JOIN Student st
            ON sc.StudentId = st.StudentId
WHERE   (sc.CourseId <> 1
        AND st.Active = 1)
ORDER   BY st.StudentAlias
选择st.StudentId、StudentAlias、StudentForename、StudentAn姓氏
来自课程c
内部连接学生课程sc
在c.CourseId=sc.CourseId上
内联学生街
在sc.StudentId=st.StudentId上
其中(sc.1)
和st.Active=1)
st.StudentAlias命令
试试这个

SELECT  st.StudentId, StudentAlias, StudentForename, StudentSurname
FROM    Course c
        INNER JOIN Student_Course sc
            ON c.CourseId = sc.CourseId
        INNER JOIN Student st
            ON sc.StudentId = st.StudentId
WHERE   (sc.CourseId <> 1
        AND st.Active = 1)
ORDER   BY st.StudentAlias
选择st.StudentId、StudentAlias、StudentForename、StudentAn姓氏
来自课程c
内部连接学生课程sc
在c.CourseId=sc.CourseId上
内联学生街
在sc.StudentId=st.StudentId上
其中(sc.1)
和st.Active=1)
st.StudentAlias命令

要查找不在课程中的活跃学生,请执行以下操作:-

SELECT  st.StudentId, StudentAlias, StudentForename, StudentSurname
FROM    Student st
LEFT OUTER JOIN Student_Course sc ON sc.StudentId = st.StudentId
LEFT OUTER JOIN Course c ON c.CourseId = sc.CourseId
WHERE   c.CourseId IS NULL
AND st.Active = 1
ORDER   BY st.StudentAlias
如果你想检查不是某门课程的学生,那么

SELECT  st.StudentId, StudentAlias, StudentForename, StudentSurname
FROM    Student st
LEFT OUTER JOIN Student_Course sc ON sc.StudentId = st.StudentId
LEFT OUTER JOIN Course c ON c.CourseId = sc.CourseId AND CourseId = 1
WHERE   c.CourseId IS NULL
AND st.Active = 1
ORDER   BY st.StudentAlias

将课程签入ON子句

以查找不在课程中的活跃学生,然后如下所示:-

SELECT  st.StudentId, StudentAlias, StudentForename, StudentSurname
FROM    Student st
LEFT OUTER JOIN Student_Course sc ON sc.StudentId = st.StudentId
LEFT OUTER JOIN Course c ON c.CourseId = sc.CourseId
WHERE   c.CourseId IS NULL
AND st.Active = 1
ORDER   BY st.StudentAlias
如果你想检查不是某门课程的学生,那么

SELECT  st.StudentId, StudentAlias, StudentForename, StudentSurname
FROM    Student st
LEFT OUTER JOIN Student_Course sc ON sc.StudentId = st.StudentId
LEFT OUTER JOIN Course c ON c.CourseId = sc.CourseId AND CourseId = 1
WHERE   c.CourseId IS NULL
AND st.Active = 1
ORDER   BY st.StudentAlias
将课程签入ON子句

尝试此查询

SELECT s.studentId, s.Forename
FROM Student s
WHERE s.studentId NOT IN (SELECT studentId 
FROM  Student_Course c WHERE c.courseId = 1) AND s.Active = 1
内部子查询返回courseId=1的学生,在外部查询中我们过滤这些学生。

尝试此查询

SELECT s.studentId, s.Forename
FROM Student s
WHERE s.studentId NOT IN (SELECT studentId 
FROM  Student_Course c WHERE c.courseId = 1) AND s.Active = 1

内部子查询返回courseId=1的学生,在外部查询中我们过滤这些学生。

什么是
1
意思?以前从未见过这意味着不等于。(sc.CourseId!=1)@Sachin啊,好的,我会测试它我已经有了下面的正确答案,当我测试你的查询时唯一的问题是它显示了一个已经在课程中的学生。无论如何,谢谢你的尝试。我认为这个查询不会返回OP想要的结果-它将返回除courseID 1之外的所有学生/课程元组的列表。
1
是什么意思?以前从未见过这意味着不等于。(sc.CourseId!=1)@Sachin啊,好的,我会测试它我已经有了下面的正确答案,当我测试你的查询时唯一的问题是它显示了一个已经在课程中的学生。无论如何,感谢您的尝试。我不认为此查询返回OP想要的结果-它将返回除courseID 1之外的所有学生/课程元组的列表。您好,测试了您的查询,但仍然输出一组空的结果,这取决于您的测试数据。唯一活跃的学生是id 1、2、4和5,他们都有课程。这将返回所有活跃但未注册/任何/课程的学生的列表。您应该为特定的课程ID添加一个连接条件。您好,测试了您的查询,但仍然输出一组空的结果,这取决于您的测试数据。唯一活跃的学生是id 1、2、4和5,他们都有课程。这将返回所有活跃但未注册/任何/课程的学生的列表。您应该为特定课程ID添加连接条件。请尝试左连接解决方案,而不是子选择。子选择通常较慢尝试左连接解决方案而不是子选择。子选择通常较慢