我有一个关于sql的问题,我想执行,但不知道如何编写它。下面是具有SO伪数据的表:
模块:

ModuleId (PK auto) ModuleNo   ModuleName
1                  CHI2523    Business

课程:
CourseId (PK auto)  CourseName
1                    Business and Computing
2                    ICT
3                    Sports

课程单元:
CourseId (PK) ModuleId (PK)
1             1
2             1

会话:
SessionId (PK auto)  SessionName  ModuleId (FK)
3                    DFRER        1

学生:
StudentId (PK auto)  StudentAlias StudentForename  StudentSurname  CourseId (FK)
1                    u03824       Bill             Murphy          1
2                    u38492       Conrad           Jones           2
3                    u48383       Jane             Peters          1
4                    u34322       Morgan           Gray            2
5                    u39292       Bilal            Tuddy           3

学生课程:
SessionId (PK)  StudentId (PK)
3               1
3               2

我希望查询能够找到的是所有剩余的学生,他们目前没有参加选定的评估,但可以阅读谁参加评估。
因此,要做到这一点,我们必须:
通过在SessionId表中查找Session来查看所选会话
通过查看SessionId表中的ModuleId来查看Session属于哪个模块。
通过查找ModuleId表查看Course_Module所属的课程
通过查看与CourseId表中的CourseId匹配的学生表中的Course_Module来查找每个学生的课程
显示属于模块所在课程的所有学员,但仅显示当前未在课程中的学员(换句话说,不在接受所选SessionSessionId表中)。
因此,如果选择的SessionId是3,那么它应该输出的学生是:
StudentId (PK auto)  StudentAlias StudentForename  StudentSurname  CourseId (FK)
3                    u48383       Jane             Peters          1
4                    u34322       Morgan           Gray            2

这是因为:
SessionId3属于ModuleId1
ModuleId属于CourseId1和2
查找CourseId1和2有4个学生参加了该课程
但其中2名学生在查看SessionId表格时已经在使用Student_Session3,因此只显示其他2名学生,因为他们目前没有参加课程
我的问题是如何编写查询才能实现上述示例?我已经开始查询了,但需要有人的帮助来增强它,使其符合上面示例的要求:
SELECT s.StudentId, StudentAlias, StudentForename, StudentSurname
FROM Session s
INNER JOIN Module m ON m.ModuleId = s.ModuleId
INNER JOIN Course_Module cm ON cm.ModuleId = m.ModuleId
INNER JOIN Student s ON cm.CourseId = s.CourseId
INNER JOIN Student_Session ss ON s.StudentId = ss.StudentId
WHERE s.SessionId = 3
ORDER BY StudentAlias;

我不知道如何检查哪些学生是/不是易读的,然后只选择那些可以进行评估但目前没有参加评估的学生

最佳答案

SELECT  e.*
FROM    Session a
        INNER JOIN Module b
            ON a.ModuleID = b.ModuleID
        INNER JOIN Course_Module c
            ON b.ModuleID = c.ModuleID
        INNER JOIN Course d
            ON c.CourseID = d.CourseID
        INNER JOIN Student e
            ON d.CourseID = e.CourseID
        LEFT JOIN Student_Session f
            ON f.sessionID = a.SessionID AND
                f.studentID = e.studentID
WHERE   a.SessionID = 3 AND
        f.studentID IS NULL
ORDER   BY e.STUDENTALIAS

SQLFiddle Demo

关于mysql - 如何编译这个复杂的sql查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14248799/

10-11 05:16