繁体   English   中英

结合大量子查询的SQL连接帮助

[英]Help with SQL join combined with lots of subqueries

我在加入方面的经验有限,这个难题困扰了我。

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

  • 学生桌
  • 分节表,描述给定课程的分节
  • 在表和学生之间建立多对多关系的映射表
  • 描述考试的考试表
  • 考试和部分之间的多对多映射表
  • 一个test_schedules表,它描述可以参加考试的日期。 考试和schedule_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))))

我不知道的是如何将联接合并到其中,以实现目标的后半部分。 我的每一次尝试都产生了语法错误。 拜托,有人能指出我正确的方向吗? 提前致谢!

您可以使用联接完成所有操作,从而以以下方式获取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

这是一个镜头:

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')

加入就像写出您的想法。

我要学生,也要各节的学生,我要各节的考试,我要根据考试时间表对考试时间表进行过滤,并以此方式进行考试...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM