【问题标题】:How to compile this complex sql query如何编译这个复杂的 sql 查询
【发布时间】:2012-12-24 07:14:43
【问题描述】:

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

模块:

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

Student_Session:

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

我希望查询能够找到当前未参加所选评估但可以清楚地参加评估的所有剩余学生。

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

  • 通过在Session 表中查找SessionId 来查看所选会话是什么

  • 通过查看Session 表中的ModuleId 来查看SessionId 属于哪个模块。

  • 通过查看Course_Module 表查看ModuleId 所在的课程

  • 通过查看学生表中与Course_Module 表中的CourseId 匹配的CourseId 来查找每个学生的课程

  • 显示属于该模块所在课程的所有学生,但仅显示当前不在会话中的学生(或者换句话说,不在Session 表中选择SessionId

所以如果SessionId选择的是3,那么它应该输出的学生是:

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

这是因为:

  • SessionId3 属于ModuleId1

  • ModuleId属于CourseId 1和2

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

  • 但是其中 2 名学生在查看 Student_Session 表时已经在参加 SessionId 3,因此仅显示其他 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;

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

【问题讨论】:

  • 您的问题已得到很好的解释。 :D

标签: mysql sql select join


【解决方案1】:
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

【讨论】:

  • 太棒了,非常感谢 JW,最佳答案 :) 一旦我达到 15 个声望点,我会给你一个赞
【解决方案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
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 中,谁不在。

【讨论】:

  • 感谢您的回答以及 aserna01
【解决方案3】:

我没有时间用你的数据创建一些测试数据库,但我希望我的代码能给你一些提示,如何达到你的目标。

你不应该在没有冲动的情况下使用 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-17
    • 2011-01-17
    • 2016-04-23
    • 2015-08-04
    • 2015-03-28
    • 2021-09-10
    • 1970-01-01
    相关资源
    最近更新 更多