如何编译这个复杂的sql查询

时间:2013-01-10 00:16:44

标签: mysql sql select join

我有一个关于我想要执行但不知道如何编写它的SQL的问题。以下是具有如此虚拟数据的表格:

模块:

ModuleId (PK auto) ModuleNo   ModuleName
1                  CHI2523    Business

课程:

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

Course_Module:

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

Student_Session:

SessionId (PK)  StudentId (PK)
3               1
3               2

我希望查询能够找到的是所有剩余的学生,他们目前没有参加选定的评估但是能够清晰地参加评估。

为了能够做到这一点,我们必须:

  • SessionId

  • 中查找Session,查看所选会话的内容
  • 查看SessionId表格中的ModuleId,了解Session所属的模块。

  • 查看ModuleId

  • ,查看Course_Module所在的课程
  • 通过查看学生表中与CourseId

  • CourseId匹配的Course_Module来查找每个学生的课程
  • 显示属于该模块所在课程的所有学生,但仅显示目前不在会话中的学生(或者换句话说,不在Session表中的学生选择{{ 1}}。

因此,如果选择的SessionId为3,则应输出的学生为:

SessionId

这是因为:

  • StudentId (PK auto) StudentAlias StudentForename StudentSurname CourseId (FK) 3 u48383 Jane Peters 1 4 u34322 Morgan Gray 2 3属于SessionId 1

  • ModuleId属于ModuleId 1和2

  • 查看CourseId 1和2,有4名学生参加该课程

  • 但其中有2名学生在查看CourseId表时已经开始SessionId 3,所以只显示其他2名学生,因为他们目前没有参加会议

    < / LI>

我的问题是如何编写查询以便能够实现上述示例?我已经开始查询,但需要有人的帮助来增强它,以便它符合上述示例的要求:

Student_Session

我不知道如何查看哪些学生/哪些学生不易读,然后只选择那些能够进行评估而且目前没有参与评估的学生

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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
LEFT OUITER JOIN Student_Session ss ON s.StudentId = ss.StudentId AND s.SessionId = 3
WHERE s.SessionId = 3
AND ss.SessionID IS NULL
ORDER BY StudentAlias;

左外连接允许您找出谁在Student_session中以及谁不在。

答案 2 :(得分:0)

我没有时间从您的数据中创建一些测试数据库,但我希望我的代码能为您提供一些提示,以及如何实现目标。

你不应该在没有冲动的情况下使用INNER JOIN。它们不利于请求性能,并且会在您不需要的情况下生成许多重复项。

也许您应该阅读本文以便更好地理解:http://www.w3schools.com/sql/sql_join.asp

SELECT s.* FROM Student AS s 

# JOIN STUDENT SESSION
LEFT JOIN Student_Session AS ss
ON (ss.StudentId = s.StudentId AND ss.SessionId = 3)

# JOIN COURSE
LEFT JOIN Course_Module AS cm
ON s.CourseId = cm.CourseId

LEFT JOIN Session AS se 
ON (cm.ModuleId = se.ModuleId AND se.SessionId = 3)

WHERE se.SessionId IS NOT NULL
AND ss.SessionId IS NULL

ORDER BY StudentAlias;