SQL连接的帮助与许多子查询相结合

时间:2011-03-24 22:27:18

标签: mysql sql join subquery

我对加入的经验有限,而这个难题让我很难过。

以下是我的mysql数据库中的相关表:

  • 学生表
  • 描述特定课程部分的部分表
  • 在部分和学生之间创建多对多关系的地图表
  • 描述考试的考试表
  • 考试和部分之间的多对多地图表
  • exam_schedules表,描述了可以参加考试的日期。考试与exam_schedules之间存在一对多的关系。

我的目标:检索所有在指定日期安排了考试的部分注册的学生。同时获取学生在给定日期必须参加的每项考试的考试安排信息。希望在每个学生< - > exam_schedule对的结果集中有一行。

我有一个查询来完成我的目标的前半部分(它有很多子查询):

SELECT * FROM `students` WHERE `id` IN
    (SELECT `student_id` FROM `sections_students` WHERE `section_id` IN
        (SELECT `section_id` FROM `sections_exams` WHERE `exam_id` IN
            (SELECT `exam_id` FROM `exam_schedules` WHERE `date` = DATE('$date') AND `exam_id` IN
                (SELECT `id` FROM `exams` WHERE `isAutoSignup` = 1))))

我无法弄清楚如何将联接纳入其中以实现目标的后半部分。我的每一次尝试都产生了语法错误。拜托,有人能指出我正确的方向吗?提前谢谢!

2 个答案:

答案 0 :(得分:3)

你可以用连接完成所有这些,从而获得exam_schedules的方式:

SELECT s.*, es.*
  FROM students s
JOIN sections_students ss on s.id          = ss.student_id
JOIN sections_exams    se on se.section_id = ss.section_id
JOIN exam_schedules    es on es.exam_id    = se.exam_id and date = DATE('$date')
JOIN exams             e  on e.id          = es.exam_id and isAutoSignup = 1

答案 1 :(得分:0)

这是一个镜头:

SELECT S.Student_name, E.Exam_name, ES.date
FROM students S
LEFT OUTER JOIN SECTIONS_STUDENTS SS
  ON SS.student_id = S.stuent_id
LEFT OUTER JOIN SECTIONS_EXAMS SE
  ON SE.section_id = SS.section_id
LEFT OUTER JOIN  EXAMS E
  ON E.exam_id = SE.exam_id
LEFT OUTER JOIN EXAM_SCHEDULES ES
  ON ES.exam_id =E.exam_id
WHERE 1=1
  AND E.isAutoSignup = 1
  AND ES.Date = DATE('$date')

加入就像写出你的想法一样。

我想要学生 我希望学生分段 我希望这些部分的考试 我想要考试的时间表 以这种方式过滤考试时间表和考试......